opencv+QT在嵌入式arm下显示图片

2019-07-13 00:13发布

你好!这里是风筝的博客,

欢迎和我一起交流。


之前在arm移植好了opencv:移植opencv到嵌入式arm详细过程
而且我之前也弄好了qt,刚好可以用来结合使用。
在qt里使用opencv在arm开发板显示一张图片 在qt里面创建一个工程: #include "widget.h" #include "ui_widget.h" #include #include #include Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); IplImage* srcImage= cvLoadImage("girl.jpg");//加载图片 cvNamedWindow("Image",1);//创建窗口 cvShowImage("Image",srcImage);//显示图像 cvWaitKey(0);//等待按键 cvDestroyWindow("Image");//销毁窗口 cvReleaseImage(&srcImage);//释放图像 } Widget::~Widget() { delete ui; } 很简单的例子,但是用到了opencv,所以在工程和Makefile里要进行一些修改:
修改.pro工程文件,我的工程时load_image:
vi load_image.pro
找到: HEADERS += widget.h 修改为: HEADERS += widget.h /usr/local/opencv/install_opencv/lib/libopencv_core.so /usr/local/opencv/install_opencv/lib/libopencv_highgui.so /usr/local/opencv/install_opencv/lib/libopencv_imgproc.so /usr/local/opencv/install_opencv/lib/libopencv_video.so 这些库文件,主要是用到什么就加什么。
然后再在底下添加: INCLUDEPATH += include/opencv include/opencv2 include 把opencv的头文件也包含进来。 接着修改Makefile文件:
找到: LIBS = $(SUBLIBS) -L/work/qt/my_qt/lib -lQt5Widgets -lQt5Gui -lQt5C ore -lpthread 修改为: LIBS = $(SUBLIBS) -L/work/qt/my_qt/lib -lQt5Widgets -lQt5Gui -lQt5C ore -lpthread -I/usr/local/opencv/install_opencv/include/opencv/ -L/usr/loca l/opencv/install_opencv/lib/ -lopencv_core -lopencv_highgui -lrt 主要就是添加后半句话,其实在哪加无所谓,加上上去就好了。 最后make即可编译可执行文件,复制到arm开发板上,执行即可!
原图:
girl 效果图:
opencv 可以看到,使用opencv的cvShowImage函数,屏幕上面会有一个栏,不怎么好看,我们可以使用另一个办法,直接把图片用QT里的label显示,使用imread函数:
cvLoadImage和imread返回值略有差异,过去的opencv处理图像倾向使用IplImage类型。现在的opencv更倾向于将图像、矩阵等等都统一使用Mat类型上。差别不大。 #include "widget.h" #include "ui_widget.h" #include #include #include "widget.h" #include #include #include #include using namespace cv; using namespace std; Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); QLabel *label_image = new QLabel(this); Mat srcImage1= imread("girl.jpg");//加载图片 Mat rgbImage; if(!srcImage1.data) { cout << "picture error!" << endl; } cvtColor(srcImage1,rgbImage,CV_BGR2RGB);//转换颜 {MOD}空间,QImage是RGB排列,而Mat 是 BGR QImage img=QImage((const unsigned char *)(rgbImage.data),rgbImage.cols, rgbImage.rows,rgbImage.cols*rgbImage.channels(),QImage::Format_RGB888);//创建QImage对象 label_image->setPixmap(QPixmap(QPixmap::fromImage(img))); label_image->resize(label_image->pixmap()->size()); label_image->move(0,0); } Widget::~Widget() { delete ui; } 得出的效果图就没有边框了:
这里写图片描述
不过这个也有个缺点,图片小时,不能填满屏幕,就看到左边是缺的黑框了
后来,我又发现个问题,QImage是RGB,所以我用了cvtColor做转换,那要是我想使用灰度图呢?
cvtColor(srcImage, srcImage, CV_BGR2GRAY);//转为灰度图
那转为灰度图了就不是RGB了。就不能使用QImage显示了,
所以得用第一个那个程序,
IplImage* srcImage= cvLoadImage(“girl.jpg”);//加载图片
修改为:
Mat srcImage= imread(“girl.jpg”);//加载图片
接着:
cvShowImage(“Image”,srcImage);//显示图像
修改为:
imshow(“Image”,srcImage);//显示图像
最后,
cvReleaseImage(&srcImage);//释放图像
修改为:
srcImage.release();
即可。
这样就能使用cvtColor处理了 或者不改,直接: //转变为灰度图 IplImage *Grayimage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U, 1); cvCvtColor(srcImage,Grayimage,CV_BGR2GRAY);