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

最近折腾一些超级麻烦的东西,先是ros后是opencv的qt、ubuntu、树莓派、win各种乱七八糟的东西,简直是“剪不断,理还乱”。好了,废话不多说,直接上方案。

关于安装qt、opencv什么的我就不详细说了,这里提点一下。关于qt版本的问题,最好还是上qt5吧,虽然没qt4那么承受,但据说支持新的opencv3比较好。不过事实上这玩意可以同时装qt4、qt5两个编译链,不喜欢随时可以换,不成问题。至于opencv这里也要说一下,我x86平台上虚拟机ubuntu16.04是源码方式安装,树莓派上是apt方式安装,具体的帖子:

http://blog.csdn.net/u011923796/article/details/47173499

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

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!




原创文章 26 获赞 9 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34917736/article/details/77345214