最近一个月一直在配置环境......安装QT、编译OpenCV,在ARM上装,在电脑上装,过程太煎熬了,翻了无数个网站,遇到了N个不知名bug......
写下这篇博客,总结一下今天的“血泪史”,也想告诉大家,配置环境特别需要耐心,一定不要泄气,多查一查博客,多找一找他人的总结,最后一定会成功的,实在不行就重新再来一遍(手动doge) 希望我的这篇总结也可以帮助到大家。
后续:(万万没想到,还会有后续......)
简述本人安装和编译opencv的过程 :
ARM板opencv + QT 环境配置:
第1次,在ubuntu上装,发现版本没装对,重来;第2次安装,由于之前在ubuntu系统上先装了QT后装了opencv,编译器版本发生冲突,ARM板刷机重来;第3次安装,从安装固件-->编译opencv-->安装QT,重新来过,ARM上的编译环境终于配置完成!
Windows系统opencv 编译:
Windows系统上编译了两个版本的opencv, 一种使用VS编译,一种使用MingW编译(用于QT),过程是这个样子的:
为了测试仿真程序,首先编译了VS版本的opencv,仿真程序顺利跑通;
使用mingw编译opencv,编译后配置环境,可以正常读取图片并显示,这一步我以为我的opencv编译好了,但是坑还在后面;
开始尝试写实时读取摄像机视频流的程序,发现VideoCapture cap(0) isOpened()函数始终返回false,即视频流始终打开失败,后来将相同的程序在ARM上进行测试,发现可以正常运行,初步断定,我的Windows下的opencv编译失败,于是重新来过;
再次编译时,发现configure时确实有报错,之前一直被我误认为是warning,忽略了,后来解决了这些问题(具体如何解决的,我会在正文中介绍),视频流可以正常读取了,这一次我以为opencv再也不会出问题了吧,结果当我开始尝试移植算法时,很不幸,又一次编译不通过,于是我重复之前的过程,将相同的程序放在ARM上编译,发现编译通过,于是,又一次断定是opencv的编译出现了问题;
第N次尝试编译opencv,好在有了之前的经验积累,这一次编译过程还比较顺利(如果还是各种Bug我真的要“疯掉”了),编译后对相同的程序进行编译,发现顺利通过,可以开始移植算法了。
NNNN......次编译opencv,心态从懵逼到不解到爆炸,到现在觉得这东西真是有点意思:) 编译环境这一过程真的很像小时候玩经典版的超级玛丽,以为自己见到胜利的曙光了,却不知道自己下一步是被乌龟撞死还是被火球喷死,一切都等重头来过,这趟“浑水”趟过去了,心态真的佛系。
这篇博客就总结了我在windows环境下,使用mingw编译opencv的通关秘籍血泪史,希望对今后的自己、对看到这篇博客的你有所帮助。
Win10 64位系统
QT 5.12.10
CMake 3.19.2
OpenCV 3.4.10
Opencv_contrib 3.4.10
下载链接:https://www.qt.io/download-qt-installer
进入QT官网,点击右上方 Download Try,点击Try Qt模块下的 Download Qt now,填写注册信息后进入下载界面,如图1所示。
这里不要直接点击Download,这里下载的Qt Online Installer是在线安装,安装不方便。
我们直接下拉界面,点击 offline packages you can get them here,进入图2所示界面
图1 QT下载
图2 下载QT离线安装包
点击链接即可直接下载安装包:qt-opensource-windows-x86-5.12.10.exe
后续安装步骤参考:https://blog.csdn.net/weixin_42322013/article/details/88808230?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control
(因为我这里之后需要和ARM进行联调,所以也只安装了MingW编译组件。)
Cmake下载链接:https://cmake.org/download/
图3 Cmake下载
安装步骤参考:https://blog.csdn.net/weixin_42322013/article/details/88808230?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control
OpenCV下载链接:https://opencv.org/releases/
因为我这里用到了opencv的附加模块,所以需要另外下载opencv_contrib, opencv_contrib的版本需要与opencv的版本一致。
opencv_contrib下载链接:https://github.com/opencv/opencv_contrib/releases
opencv与opencv_contrib下载完成后,解压至某指定文件夹,将opencv_contrib文件夹拷贝至opencv文件夹下。
至此,我们需要安装的都已经安装完成,下一步是配置环境变量。
- 右击 此电脑
- 点击属性
- 点击 高级系统设置
- 点击 环境变量
- 选择 系统变量 中的 Path
- 点击 编辑
- 点击新建,按照自己安装QT的路径,添加图4所示两条路径
图4 配置QT路径
接下来,是最重要也是最“玄学”的一步,编译OpenCV.
参考链接:https://wiki.qt.io/How_to_setup_Qt_and_openCV_on_Windows
第一步:双击cmake-gui,进入图5所示界面。
更新 Where is the source code: 与 Where to build binaries: 后面的路径,分别选择opencv文件夹下的source和build文件夹。
图5 选择编译路径
第二步:选择编译器
第三步:配置编译器路径
C: E:\QT\Tools\mingw730_64\bin\gcc.exe
C++: E:\QT\Tools\mingw730_64\bin\g++.exe
Fortran:不需要填写
第四步:设置QT5_DIR路径
第五步:设置 OPENCV_EXTRA_MODULES_PATH 为 “opencv_contrib/modules"所在路径(不要复制,在cmake界面选择"opencv_contrib/modules"文件夹,让其自动生成路径)
第六步:勾选 "OPENCV_ENABLE_NONFREE"(参考链接:https://blog.csdn.net/weixin_42920501/article/details/103798468)(如果使用sift算子一定要勾选该选项)
- 设置QT5_DIR路径为:E:\QT\5.12.10\mingw73_64\lib\cmake\Qt5
- 勾选 WITH_QT , WITH_OPENGL
- 取消勾选 ENABLE_PRECOMPILED_HEADERS
- 点击 “Add Entry" 添加 OPENCV_VS_VERSIONINFO_SKIP = 1(Value √)
- 设置 OPENCV_EXTRA_MODULES_PATH 为 “opencv_contrib/modules"所在路径
- 勾选 OPENCV_ENABLE_NONFREE
第五步:构建并生成
分别点击cmake-gui界面下的 Configure 与 Generate
第六步:编译OpenCV
完成上述步骤后,opencv文件夹下多出opencv-build文件夹
cd opencv_build
mingw32-make -j 8
// 编译完成后,进行安装
mingw32-make install
至此,编译与安装OpenCV任务完成。
在opencv文件夹下新建名为“opencv.pri”的文件,在文件夹中添加以下内容:
INCLUDEPATH += D:\opencv\opencv\opencv_build\install\include
LIBS += D:\opencv\opencv\opencv_build\lib\libopencv_*.a
之后每新建一个工程,需要在.PRO文件最后添加语句:
include(D:/opencv3.4.10/opencv.pri)
(这一步报错可以解释为什么我最初编译的opencv不能读取视频流,ffmpeg未编译成功。
ffmpeg的功能:(1)视频采集,(2)视频格式转换,(3)视频截取,(4)视频添加水印。
之所以在configure的过程中报错是因为我没有连外网,这些文件的下载链接打不开,其不能自行下载,所以解决的办法就是自行去github上下载。
此问题的解决方案:
1. 自行下载文件的github网站
https://github.com/opencv/opencv_3rdparty
2. 在branch中按照文件名搜索对应版本的文件并下载
3. 在本地查询下载文件的MD5码,查询方式:
cd /d [DownloadDir] # [Download]为下载文件的路径
certutil -hashfile [filename] MD5 # [filename] 为待查询文件名
4. 若MD5码与.cache文件夹下文件的MD5码不一致,则需更改.cmake文件,更改方式:
# fmepg为例
cd /d [path]/opencv/3rdparty/ffmepg # [path]为opencv本机保存路径
打开文件夹下的ffmpeg.cmake文件
在.cmake文件中找到语句
ocv_update(FFMPEG_BINARIES_COMMIT "……")
ocv_update(FFMPEG_FILE_HASH_BIN32 "……")
ocv_update(FFMPEG_FILE_HASH_BIN64 "……")
ocv_update(FFMPEG_FILE_HASH_CMAKE "……")
将""内的内容替换为对应的自行下载文件的MD5码,并保存.cmake文件
5. 重新configure即可。
参考博客:
下载ffmepg文件
https://blog.csdn.net/qq_34801642/article/details/105577349
https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20191018
https://blog.csdn.net/yiyuehuan/article/details/52951574
查询文件的MD5号,更新.cmake文件
https://blog.csdn.net/pyt1234567890/article/details/106525475/
解决方案
打开 \build\modules\core\CMakeFiles\opencv_core.dir\build.make 文件,并定位至 1508行按照提示,进入对应文件夹,使用mingw32编译并生成文件
安装部分参考:https://blog.csdn.net/weixin_42322013/article/details/88808230?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.control
但从编译部分开始,一定要参考:https://wiki.qt.io/How_to_setup_Qt_and_openCV_on_Windows
第一篇博客给出的cmake-gui部分介绍不全面,包括设置“QT5_DIR”和“取消勾选 ENABLE_PRECOMPILED_HEADERS”
所以在编译的过程中遇到了很多错误,也有的博客提到 “取消勾选 WITH_IPP”,如果编译出错,可以试一下。