最近折腾一些超级麻烦的东西,先是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
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!