Windows系统 为 QT5软件 搭建 OpenCV2 开发环境

我们的电脑系统:Windows 10 64位

Qt5 软件:Qt 5. 7. 0

OpenCV2 版本:OpenCV2.4.10

1. 安装 Qt 5 软件

请见博客:Windows系统 安装 Qt 5.7.0

注意: 请你务必要看这个Qt软件的安装教学。如果你没有像教学里面一样添加环境变量的话,请你添加Qt软件的环境变量。

2. 安装 CMake 软件

请见博客:Windows系统 安装 CMake

3. 下载 OpenCV 源代码

OpenCV官网下载:

4. 编译 OpenCV2.4.10

Step 1 . 打开 CMake 软件。

点击Browse Source… 按钮,选择 OpenCV源代码 所在目录:xxx/opencv/sources

Step 2 .

1. 我们在 xxx/opencv/ 路径里面, 新建一个名字为 opencv-qt5-build的文件夹。这个文件夹是用来存放 编译OpenCV后生成的文件 的文件夹。

2. 点击 Browse Build…(源码路径) 按钮,选择 xxx/opencv/opencv-qt5-build 路径

完成上面的 Step 1Step 2后,现在是这个样子的:

Step 3 .

  1. 现在点击:Configure (生成路径)按钮

  1. 再新弹出的窗口里面选择:MinGW Makefiles。如下图所示:

Step 4 . Configure结束后,会出现粉红色背景的各种选项。拖动滑块到页面下部位置。勾选:WITH_OPENGLWITH_QT 这两个复选框:

Step 5 . 再次点击Configure按钮。这次粉红色背景的各种选项,是刚刚检测到的Qt5相关的:

注意:如果你在安装Qt5软件的步骤中,没有给Qt5添加环境变量的话,那么在这一步,CMake软件是不会找到这次Qt5相关的项的。

如果你在这一步时,遇到问题。请参考这个网站:http://blog.csdn.net/zhaocj/article/details/38944037,或许可以解决你的问题。

Step 6 . 再次点击Configure按钮,知道粉红色消失

Step 7 . 点击 Generate 按钮,生成 makefile 文件.成功后,底下会提示 :Generating done。如下图所示:(这里,我需要了很多的警告:CMake Warning (dev),没有关系,不用管它。)

Step 8 . 打开 cmd,进入刚才设置的目标路径(D:\software_install_package_win\OpenCV2\opencv\opencv_qt5_build)

cd D:
D:
cd D:\software_install_package_win\OpenCV2\opencv\opencv_qt5_build

输入操作命令,如下图所示:

Step 9 . 输入 mingw32-make 命令开始编译(编译前,关闭所有杀毒软件)。如下图所示:

这是一个漫长的过程,大约需要 20分钟 ~ 60分钟。

在这漫长的编译时间里,我先简单介绍一下:OpenCV就是一个比较大的程序工程。我们使用CMake软件是为了生成OpenCV这个程序工程适合于我们电脑系统及开发软件的一个用于编译程序的MakeFile文件。 “使用 mingw32-make 命令编译OpenCV”:就是使用这个刚刚生成的MakeFile文件来编译OpenCV源代码。当编译完成之后,我们使用mingw32-make install命令,来自动安装:从OpenCV 源代码中编译生成的可执行文件。(对于Windows系统来说,其实这一步我们可以不做。因为它并没有安装在系统磁盘里面,只是存放在xxx\opencv\opencv_qt5_build路径里的install文件夹里,并且这个文件夹里的内容,我们又不用。)

大家都知道,要想让源代码生成可执行文件,必须要经历两个步骤:

1. 编译 :将源代码编译成多个链接文件

2. 链接 :将多个链接文件链接起来,生成一个可执行文件。

对于OpenCV,它是一个库,我们需要的是:它编译出来的链接文件,就可以了。当我们自己写程序的时候,如果程序里面使用到某些OpenCV相关的函数时,那么在编译和链接我们自己程序的时候。在编译过程中,就只是编译我们自己的程序源代码;而在链接过程中,是将我们的程序生成的链接文件和使用到的OpenCV的某些链接文件链接到一起,最终生成一个可执行文件。

大家现在也都轻身经历了,编译OpenCV源代码(生成链接文件)是需要花费很长的时间的。你可以想象一下:如果我们自己写的程序每次编译都要编译OpenCV源代码的话,那是一件多么坑爹的事情。如果我们先把OpenCV的源代码单独编译,生成链接文件。这样在我们自己的程序里面,如果使用到了OpenCV库的函数,我们只要让我们的程序知道OpenCV的链接文件的所在路径,我们就可以在编译程序的时候,只编译我们自己的程序,而在链接的时候,选择性的链接OpenCV的链接文件,这样生成可执行文件的速度就快得多了。

这就是为什么我们现在要花这么长的时间,在这里编译OpenCV源代码的原因。不知道我有没有说清楚。

好了,现在已经编译完成了。

Step 10 . 执行 mingw32-make install,大约 30秒 ~ 90秒 的时间。

5. 将编译生成的有用的OpenCV相关文件,整理出来

来到xxx/opencv/opencv_qt5_build/install路径里面:

我们需要这个路径里面的x64/mingw/binx64/mingw/lib 以及 install 这三个文件夹。(这三个文件夹是有用的,其他的都是没有用的文件)

Step 1 . 新建一个文件夹opencv2410-qt5,(文件夹名不能有中文,不能有空格和其他特殊符号):路径为:C:\third_packages\opencv\opencv2410-qt5

Step 2 . 拷贝这三个有用的文件夹,放在这个opencv2410-qt5文件夹下:

Step 3. 添加环境变量。将OpenCVbin目录添加到环境变量里面:

C:\third_packages\opencv\opencv2410-qt5\bin

做到这一步。为Qt CreatorOpenCV 的环境就算是搭建完成了。

下面我们编写一个类似 HelloWorld 的程序来测试一下,刚刚搭建的环境是否可以使用。

6. 测试

Step 1 . 打卡 Qt Creator,新建一个空的控制台应用工程。

将工程名命名为:helloWorld

Step 2 . .pro文件中添加 OpenCV头文件链接文件 所在路径

将下面的代码添加到 helloWorld.pro 文件里面:

INCLUDEPATH+=C:\third_packages\opencv\opencv2410-qt5\include\opencv \
C:\third_packages\opencv\opencv2410-qt5\include\opencv2 \
C:\third_packages\opencv\opencv2410-qt5\include LIBS+= C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_calib3d2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_contrib2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_core2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_features2d2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_flann2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_gpu2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_highgui2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_imgproc2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_legacy2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_ml2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_nonfree2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_objdetect2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_ocl2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_photo2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_stitching2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_ts2410.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_video2410.dll.a \
C:\third_packages\opencv\opencv2410-qt5\lib\libopencv_videostab2410.dll.a \

添加后,如图所示:

Step 3 . 先将图片 image.jpg(去网上随便找一个图片,然后命名为:image.jpg) 放在与 main.cpp 文件同一文件夹下。

Step 4 . 将下面的代码复制到main.cpp文件里面:

#include <QCoreApplication>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp> int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); cv::Mat image = cv::imread("..\\helloWorld\\image.jpg");
cv::namedWindow("Image");
cv::imshow("Image", image); cv::waitKey(0);
return a.exec();
}

运行程序(快捷键:Ctrl + R):

注意:

图片的路径一定要正确。否则你会遇到下面的问题:

init done
opengl support available
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file D:\software_install_package_win\OpenCV2\opencv\sources\modules\highgui\src\window.cpp, line 269
terminate called after throwing an instance of 'cv::Exception'
what(): D:\software_install_package_win\OpenCV2\opencv\sources\modules\highgui\src\window.cpp:269: error: (-215) size.width>0 && size.height>0 in function imshow This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

解决办法:

就是使用正确的图片路径。并且路径不能有中文,空格和一些奇怪的符号。

搞定


最新文章

  1. xp_sendmail: 由于邮件错误 0x80004005 而失败
  2. java枚举与.net中的枚举区别
  3. 地产cio揭秘:帆软大商业智能解决方案如何助力地产行业信息化
  4. monkey基本命令参数详解示例
  5. c# Winforms WebBrowser - Clear all cookies
  6. 【FreeBuf视频】《安全大咖说》专访知道创宇CTO杨冀龙(watercloud)
  7. ibatis框架文件配置
  8. Python Socket,How to Create Socket Server? - 网络编程实例
  9. tomcat thread dump 分析【转载】
  10. 通过CSS实现各种方向的三角形
  11. 微信公众号开发笔记2(nodejs)
  12. linux用curl发送post请求
  13. 二、初始化superset
  14. 循环语句(for,while,do……while),方法概述
  15. C++ 容器操作
  16. Win32-API: 终于能正常的捕获焦点事件: WM_COMMAND、BN_SETFOCUS、EN_SETFOCUS
  17. Oracle 实例名/服务名 请问SID和Service_Name有什么区别啊?
  18. ES6 proxy(代理拦截) &amp;&amp;Reflect
  19. NOIP初赛知识点
  20. 【C语言】为什么指明数组的列数?

热门文章

  1. oracle管理优化必备语句以及oracle SQL语句性能调整
  2. 3.16 draw 3.17 更新函数
  3. vector的简单运用(士兵队列训练问题)
  4. 图的m着色问题 (回溯搜索)
  5. mysql开启和使用事件、与服务器重启mysql错误
  6. nodejs express mysql
  7. 用TCP穿透NAT(TCP打洞)的实现
  8. flask之flask_bootstrap
  9. Linux cciss磁盘设备文件的说明
  10. STM32 -- 硬件知识