《OpenCV》Part1 OpenCV3.1.0安装配置与Qt5.5测试

来源:互联网 发布:wps for ubuntu 16.04 编辑:程序博客网 时间:2024/05/16 12:45

《OpenCV》Part1 OpenCV安装配置与Qt5.5测试

配置环境:

VS2013

Qt5.5.0

OpenCV3.1.0

cmake-3.6.1-win32-x86


1、先去OpenCV官网下载最新的opencv,现在是3.10版本。

2、下载回来的opencv3.1.0其实一个自压缩的文件,将其放在了D盘根目录下了,方便后续的编译和环境变量设置。

3、下载CMAKE,利用CMAKE建立VS的SOLUTION。可以去下载最新的CMAKE,我自己用CMAKE3.6.1,各种版本自己下个就行了,下载后点击cmake-gui.exe右键——以管理员方式运行,设置opencv的sources目录,以及生成的solutions的目录。

      1)点第一次configure的时候,会弹出一个现在编译器的对话框,它会自动选择VS2013,其他的默认即可。预计几分钟后会出现下图样子;

      2)实际上openCv3.1.0在CMake时是需要连国外的服务器下载相应的dll后才能编译成功的。就出现了下述的长篇大论,网上找的,不过很实用:

CMake过程中一直出现下面错误提示:


Downloading opencv_ffmpeg_64.dll...


CMake Error at cmake/OpenCVUtils.cmake:895 (file):


file DOWNLOAD HASH mismatch




for file: [D:/Program Files (x86)/opencv/sources/3rdparty/ffmpeg/downloads/35fe6ccdda6d7a04e9056b0d73b98e76/opencv_ffmpeg_64.dll]


expected hash: [35fe6ccdda6d7a04e9056b0d73b98e76]


actual hash: [f112aef8bcfad76757e2ebf06c7cf6e5]


status: [28;"Timeout was reached"]




Call Stack (most recent call first):


3rdparty/ffmpeg/ffmpeg.cmake:15 (ocv_download)


cmake/OpenCVFindLibsVideo.cmake:206 (include)


CMakeLists.txt:536 (include)




CMake Error at cmake/OpenCVUtils.cmake:899 (message):


Failed to download opencv_ffmpeg_64.dll. Status=28;"Timeout was reached"


Call Stack (most recent call first):


3rdparty/ffmpeg/ffmpeg.cmake:15 (ocv_download)


cmake/OpenCVFindLibsVideo.cmake:206 (include)


CMakeLists.txt:536 (include)


读一下这几行,可以大致了解如下,在编译过程中,程序下载了一个文件,它的hash值与所期待的不一致,所以导致了错误,接下来到CMakeLists.txt文件(在…...\opencv\sources)中去定位,然而看不懂。。。。。。于是去网上搜索opencv_ffmpeg_64.dll,下载至....../opencv/sources/3rdparty/ffmpeg/downloads/35fe6ccdda6d7a04e9056b0d73b98e76/下载链接:http://pan.baidu.com/s/1gfE3gHl


还是错误,不过错误提示变了:


Downloading opencv_ffmpeg.dll...


CMake Error at cmake/OpenCVUtils.cmake:895 (file):


file DOWNLOAD HASH mismatch



for file: [D:/Program Files (x86)/opencv/sources/3rdparty/ffmpeg/downloads/89c783eee1c47bfc733f08334ec2e31c/opencv_ffmpeg.dll]


expected hash: [89c783eee1c47bfc733f08334ec2e31c]


actual hash: [3de6314883587d538b4864070e0a749d]


status: [28;"Timeout was reached"]




Call Stack (most recent call first):


3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)


cmake/OpenCVFindLibsVideo.cmake:206 (include)


CMakeLists.txt:536 (include)



CMake Error at cmake/OpenCVUtils.cmake:899 (message):


Failed to download opencv_ffmpeg.dll. Status=28;"Timeout was reached"


Call Stack (most recent call first):


3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)


cmake/OpenCVFindLibsVideo.cmake:206 (include)


CMakeLists.txt:536 (include)



继续下载了一个opencv_ffmpeg.dll,替换至.../opencv/sources/3rdparty/ffmpeg/downloads/89c783eee1c47bfc733f08334ec2e31c/下载链接:http://pan.baidu.com/s/1dEAnopN


然后开始Downloading ippicv_windows_20151201.zip,我知道肯定下载不了,继续自己下载,http://pan.baidu.com/s/1c27hCT6


放到/opencv/sources/3rdparty/ippicv/downloads/windows-04e81ce5d0e329c3fbc606ae32cad44d/继续configure。。。。。。如下图,Configuring done

      3)再点第二次configure,具体的勾选项可以参考下面两幅图,如果勾选后编译错误,那么勾选的选项自己就得注意点了(这时在勾选后出错的选项可以去勾选,其实configure的次数是几次是没有关系的,只要CMake时不报错,都是没有问题的),等configure完成后,再点generate,结束后会在你的输出目录里生成OpenCV.sln

注意点:

1)CMake时要注意CMAKE_INSTALL_PATH,看默认的路径是哪里,方便后面在VS2013中编译时查找OpenCV.sln文件;

2)VS2013中编译时会有Debug版和Release版,为了区分他们,肯定不能让他们的名字一模一样,所以可以在CMake界面中的Add Entry按键中添加CMAKE_DEBUG_PREFIX,类型为STRING,值为-gd,如果想编译出来的Release版也带后缀,同理可以自己设置值,这里略过。



4、以管理员方式用vs打开OpenCV.sln。如下图,先build ALL_BUILD的X86 DEBUG版本,然后再build CMakeTargets下面的install,完成后会生成install\x86\vc14\lib目录,将X86目录直接拷贝到opencv的build目录下。

同理编译Release版,编译完了,Install一下就好了。

5、编译后会生成很多库,但OpenCV自带的X64的为什么就只2个库呢,一个是release的opencv_world310.lib,一个是debug的opencv_world310-gd.lib。

6、将编译后的Lib库合成成一个。

        我们要把自己编译的X86的合并成一个文件库,用VS自带的LIB工具。打开VS的命令行,进入到刚才的…\LIB目录下,用下面的命令把那个目录下所有不带D后缀(release版本)的先合成一个opencv-r.lib。对于生成opencv-gd.lib,也是一样的,只是把下面命令里的lib的点前面的r改为gd;中间会提示很多WARNING,全部无视。


第一步:CD D:\OpenCV3.1.0\opencvfile\lib\Debug

第二步:lib /out:opencv-gd.lib opencv_calib3d310-gd.lib opencv_calib3d310-gd.lib opencv_core310-gd.lib opencv_features2d310-gd.lib opencv_flann310-gd.lib opencv_highgui310-gd.lib opencv_imgcodecs310-gd.lib
opencv_imgproc310-gd.lib opencv_ml310-gd.lib opencv_objdetect310-gd.lib opencv_photo310-gd.lib opencv_shape310-gd.lib opencv_stitching310-gd.lib opencv_superres310-gd.lib opencv_ts310-gd.lib opencv_video310-gd.lib opencv_videoio310-gd.lib opencv_videostab310-gd.lib opencv_viz310-gd.lib

注:lib文件名提取有个小技巧,这里不再赘述,在我的VTK6.2+VS2013+Qt5.5 测试VTK基于VS2013的Qt程序

一文中有详细介绍。

下面给出Release版的lib库合成命令截图:


7、配置环境变量,此处直接上图,不多介绍,注意的地方就是debug和Release的lib和dll库路径分开:


8、配置VS,做成了一个opencv.props文件。以后要用OPENCV的工程里面加入这个文件即可。

这个可以参照我得链接里给出的文章里介绍的方法。

主要就是添加.h文件、添加.lib文件(已经合成为一个了)、添加.dll文件路径,末尾别忘了把.dll文件拷贝到系统文件夹中,否则有的时候程序是没法运行的,我的win7&64位系统路径是C:\Windows\SysWOW64,此处不再赘述了。

9、

1)VS控制台程序自己测试下就可以了,记得添加opencv.props

#include  #include   #include       using namespace cv;      int main()  {      // 读入一张图片(原始图片)      Mat img=imread("pic.jpg");      // 创建一个名为 "图片"窗口      namedWindow("<span style="font-family: Arial, Helvetica, sans-serif;">原始图片</span><span style="font-family: Arial, Helvetica, sans-serif;">");  </span>    // 在窗口中显示<span style="font-family: Arial, Helvetica, sans-serif;">原始图片</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>    imshow("<span style="font-family: Arial, Helvetica, sans-serif;">原始图片</span><span style="font-family: Arial, Helvetica, sans-serif;">",img);  </span>    // 等待6000 ms后窗口自动关闭      waitKey(6000);  } 
效果图:

2)Qt5程序名QtTest,类型:application,继承窗口类QMainWindow,添加opencv.props属性表文件

qttest.h:

#ifndef QTTEST_H#define QTTEST_H#include <QtWidgets/QMainWindow>#include "ui_qttest.h"#include <QFileDialog>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/opencv.hpp>class QtTest : public QMainWindow{Q_OBJECTpublic:QtTest(QWidget *parent = 0);~QtTest();public://void onPushButton_clicked();private:Ui::QtTestClass ui;cv::Mat image;//图像变量private slots:void onPushButton_clicked();void onPushButton_2_clicked();};#endif // QTTEST_H

qttest.cpp,有的地方与Qt4是不同的,需要留意下:

#include "qttest.h"QtTest::QtTest(QWidget *parent): QMainWindow(parent){ui.setupUi(this);ui.pushButton_2->setEnabled(false);//set process button disableconnect(ui.pushButton,SIGNAL(clicked()),this,SLOT(onPushButton_clicked()));connect(ui.pushButton_2, SIGNAL(clicked()),this,SLOT(onPushButton_2_clicked()));}QtTest::~QtTest(){}void QtTest::onPushButton_clicked(){QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));//QFileDialogimage = cv::imread(fileName.toLocal8Bit().data());//cv::namedWindow("Original Image");//cv::imshow("Original Image", image);if (image.data){cv::cvtColor(image, image, CV_BGR2RGB);//CV_BGR2RGBQImage img_orig = QImage((const unsigned char*)(image.data),//Qt image structureimage.cols, image.rows, QImage::Format_RGB888);ui.label->setPixmap(QPixmap::fromImage(img_orig));//cv::namedWindow("Original Image");//cv::imshow("Original Image",image);ui.pushButton_2->setEnabled(true);}}void QtTest::onPushButton_2_clicked(){cv::flip(image, image, 1);//process the image//cv::cvtColor(image, image, CV_BGR2RGB);//change color channel ordering//*cv::cvtColor(image,image,CV_BGR2RGB);这句如果不注释,输出的图片颜色偏黄,该句在onPushButton_clicked函数中已经变化了*//QImage img = QImage((const unsigned char*)(image.data),//Qt image structureimage.cols,image.rows,QImage::Format_RGB888);ui.label->setPixmap(QPixmap::fromImage(img));//display on lableui.label->resize(ui.label->pixmap()->size());//resize the lable to fit the image//cv::namedWindow("Output Image");//cv::imshow("Output Image", image);}

main.cpp,这个代码没有做任何更改:

#include "qttest.h"#include <QtWidgets/QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);QtTest w;w.show();return a.exec();}

运行结果:





0 0
原创粉丝点击