红联Linux门户
Linux帮助

基于qt的arm与x86两种平台的opencv开发

发布时间:2017-08-18 09:21:28来源:linux网站作者:qq_34917736
最近折腾一些超级麻烦的东西,先是ros后是OpenCV的qt、ubuntu、树莓派、win各种乱七八糟的东西,简直是“剪不断,理还乱”。好了,废话不多说,直接上方案。
关于安装qt、opencv什么的我就不详细说了,这里提点一下。关于qt版本的问题,最好还是上qt5吧,虽然没qt4那么承受,但据说支持新的opencv3比较好。不过事实上这玩意可以同时装qt4、qt5两个编译链,不喜欢随时可以换,不成问题。至于opencv这里也要说一下,我x86平台上虚拟机ubuntu16.04是源码方式安装,树莓派上是apt方式安装:
sudo apt-get install libcv-dev直接又方便。
但这里就有一个问题,我找遍全网,结果都说.so的库文件是安装在usr/lib/下面,结果找了老半天找不到。后来直接查找,才发现根本不再这个目录!
/usr/lib/arm-linux-gnueabihf/目录下面才存放库文件,而且跟库文件编译安装在x86平台上不同,很多头文件、库的名称、形式都有改变!
 
首先我们来说一下x86平台上基于ubuntu 16.04tls+qt5+opencv3.2的视觉处理:
(一)图片处理:
我们需要在qt上建立一个控制台应用程序:Qt Console Application
基于qt的arm与x86两种平台的opencv开发
main.cpp代码:
#include <QCoreApplication>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
using namespace cv;  
int main()  
{  
String title = "img";  
namedWindow( title, WINDOW_AUTOSIZE );  
Mat src1 = imread( "/home/tinnu/1.jpg" );  
cv::namedWindow(title,cv::WINDOW_NORMAL);  
cv::imshow( title, src1 );  
cv::waitKey(0);  
cv::destroyAllWindows();  
}
.pro文件末尾加两行:
INCLUDEPATH += /usr/local/include \  
/usr/local/include/opencv \  
/usr/local/include/opencv2  
LIBS += /usr/local/lib/libopencv_highgui.so \  
/usr/local/lib/libopencv_core.so    \  
/usr/local/lib/libopencv_imgproc.so \  
/usr/local/lib/libopencv_imgcodecs.so
这样写比较全面,实际上并不需要这么多库,简单的两个就可以了。
INCLUDEPATH += /usr/local/include \  
/usr/local/include/opencv2  
LIBS += /usr/local/lib/libopencv_highgui.so \  
/usr/local/lib/libopencv_core.so
这里体现了两件事:
opencv的头文件在我x86+ubuntu 16.04平台上安装在/usr/local/include里面,而.so的库文件则在/usr/local/lib/里面。
 
(二)视频采集:
main.cpp:
#include <QCoreApplication>  
#include <highgui.h>//包含opencv库头文件  
#include <cv.h>  
#include <videoio.hpp>  
int main( int argc, char** argv ) {//主函数  
cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );//创建窗口,(名字,默认大小)  
CvCapture *capture   = NULL;// 视频获取结构, 用来作为视频获取函数的一个参数  
capture = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频  
IplImage* frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像  
while(1) {  
frame = cvQueryFrame( capture );// 从摄像头中抓取并返回每一帧  
if( !frame ) break;  
cvShowImage( "Example2", frame );//在窗口上显示每一帧  
char c = cvWaitKey(33);//延时,每秒钟约33帧;符合人眼观看速度;  
if( c == 27 ) break;//由于是死循环,而且没有控制台,当按下键盘exc键,退出循环;  
}  
cvReleaseCapture( &capture );//释放内存;  
cvDestroyWindow( "Example2" );//销毁窗口  
}
.pro文件:
INCLUDEPATH += /usr/local/include \  
/usr/local/include/opencv2  
LIBS += /usr/local/lib/libopencv_highgui.so \  
/usr/local/lib/libopencv_core.so    \  
/usr/local/lib/libopencv_videoio.so
 
然后再来说说基于arm平台(树莓派)的ubuntu mate 16.04tls+qt5+opencv3.2的视觉处理:
图像处理是一样的就不必再讨论,这里说一下摄像头图像采集:
main.cpp的头文件略有变化,可能是由于apt形式安装的源码头文件并不相同:
#include <QCoreApplication>  
#include <highgui/highgui.hpp>//包含opencv库头文件  
#include <cv.hpp>  
#include <video/video.hpp>  
int main(int argc, char** argv) {//主函数  
cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE);//创建窗口,(名字,默认大小)  
CvCapture *capture = NULL;// 视频获取结构, 用来作为视频获取函数的一个参数  
capture = cvCreateCameraCapture(-1);//打开摄像头,从摄像头中获取视频  
IplImage* frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像  
while (1) {  
frame = cvQueryFrame(capture);// 从摄像头中抓取并返回每一帧  
if (!frame) break;  
cvShowImage("Example2", frame);//在窗口上显示每一帧  
char c = cvWaitKey(33);//延时,每秒钟约33帧;符合人眼观看速度;  
if (c == 27) break;//由于是死循环,而且没有控制台,当按下键盘exc键,退出循环;  
}  
cvReleaseCapture(&capture);//释放内存;  
cvDestroyWindow("Example2");//销毁窗口  
}
.pro文件则大有讲究:
INCLUDEPATH += /usr/include \  
/usr/include/opencv \  
/usr/include/opencv2  
LIBS += /usr/lib/arm-linux-gnueabihf/libopencv_highgui.so \  
/usr/lib/arm-linux-gnueabihf/libopencv_core.so    \  
/usr/lib/arm-linux-gnueabihf/libopencv_video.so
可以看出,arm平台上的libopencv_video.so取代了x86平台上的libopencv_videoio.so!
 
本文永久更新地址:http://www.linuxdiyf.com/linux/32348.html