厌倦了每天重复复制问题,回退版本的重复劳动,希望能开发一个自动测试的工具,把这些重复劳动交给电脑来自动完成。
为了能识别出电视是不是正常工作,所以这个工具需要能通过摄像头来自动识别电视机处于关机,黑屏,显示正常图像,显示异常图像之类。基于这个需求,需要找一个图像处理开源库。在网上转了一圈,发现openCV是个比较热门的图像处理库。没有基础,那就边学边开搞吧。
由于我的笔记本运行的系统是UBUNTU,所以就选用了Qt+openCV来搭建开发软件。
首先要装Qt。最新的版本是QT5.8,去官网下载一个离线安装包,然后直接运行就可以了。我不知道安装完以后qtcreator被装到哪里去了,就在第一次打开qtcreator的时候把qtcreator给“lock to luncher”了,这样以后用起来会方便些
其次是下载openCV3,2,按照网上的教程,首先解压出源代码,然后在源代码里建立一个build目录。
进入build目录后,执行 如下命令:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv320 .. make clean make install在执行完后,库文件会被安装到如下路径
/usr/local/opencv320
在安装完之后,一定要把 lib文件的路径放到/opt/openCV/opencv-3.2.0/openCV.conf 文件里去,否则的话,在运行时会出现这样的错误信息:
QtOpenCV: error while loading shared libraries: libopencv_core.so.3.2: cannot open shared object file: No such file or directory
到这里,配置工作就结束了,下面可以用qt建立一个项目测试一下opencv能不能正常工作
首先建立一个qt工程,图形界面的和终端应用程序都行。
INCLUDEPATH += /usr/local/opencv320/include \ /usr/local/opencv320/include/opencv \ /usr/local/opencv320/include/opencv2 LIBS += /usr/local/opencv320/lib/libopencv_core.so \ /usr/local/opencv320/lib/libopencv_highgui.so \ /usr/local/opencv320/lib/libopencv_imgcodecs.so \ /usr/local/opencv320/lib/libopencv_imgproc.so \ /usr/local/opencv320/lib/libopencv_ml.so \ /usr/local/opencv320/lib/libopencv_objdetect.so \ /usr/local/opencv320/lib/libopencv_photo.so \ /usr/local/opencv320/lib/libopencv_shape.so \ /usr/local/opencv320/lib/libopencv_stitching.so \ /usr/local/opencv320/lib/libopencv_superres.so \ /usr/local/opencv320/lib/libopencv_video.so \ /usr/local/opencv320/lib/libopencv_videoio.so \ /usr/local/opencv320/lib/libopencv_videostab.so \
之后,可以打开mainwindow.cpp (我建立的是一个GUI应用程序),在mainwindow.cpp里加上点测试代码
#include "mainwindow.h" #include "ui_mainwindow.h" #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); String title = "img"; cv::namedWindow( title,WINDOW_AUTOSIZE ); } MainWindow::~MainWindow() { delete ui; }剩下的,就是编译运行了。