1 简介
本机环境:windows10 64位;QT:5.14.2 ;本次移植不涉及源码编译,直接使用的编译好的源码。
2 MINGW编译环境
2.1 库文件下载
编译好的库文件下载地址:IJustLoveMyself/OpenCV-MinGW-Build: 👀 MinGW 32bit and 64bit version of OpenCV compiled on Windows. Including OpenCV 3.3.1, 3.4.1, 3.4.1-x64, 3.4.5, 3.4.6, 3.4.7, 3.4.8-x64, 3.4.9, 4.0.0-alpha-x64, 4.0.0-rc-x64, 4.0.1-x64, 4.1.0, 4.1.0-x64, 4.1.1-x64, 4.5.0-with-contrib, 4.5.2-x64 (github.com)
选择根据configuration的信息尽量选择合适的文件进行下载,我的编译器时MINGW73,一次我选择了4.5.0的下载。下载后解压。
2.2 添加库
- 新建一个QT工程,我选择的库是使用mingw32-make.exe编译的,因此我建立工程选择的构建套件是MINGW 32-bit。
- 在工程的目录下面新建一个文件夹opencv,用于存放相关文件。
- 复制OpenCV-MinGW-Build-OpenCV-4.5.0-with-contrib\x64\mingw下的lib文件夹至opencv文件夹下面
- 复制OpenCV-MinGW-Build-OpenCV-4.5.0-with-contrib下的include文件夹至opencv文件夹下面
- OpenCV-MinGW-Build-OpenCV-4.5.0-with-contrib\x64\mingw\bin这个文件夹有两种处理方式,第一种:加入系统的环境变量,第二种:复制到我们每一个新建的工程中去,因为我只是这一个项目需要用,所以我用的是第二种方式。
最终我的目录结构大致如下
opencvtest
|_opencvtest\build-opcvtest-Desktop_Qt_5_14_2_MinGW_32_bit-Debug
|_opcvtest|_opencv|_include|_lib|_main.cpp|_mainwindow.cpp|_mainwindow.h|_mainwindow.ui|_opcvtest.pro
2.3 修改.pro文件
在pro文件中添加如下,导入库文件。
opencv += $$PWD/opencv/INCLUDEPATH += \$${opencv}/includeLIBS += \$${opencv}/lib/libopencv_*.a
2.4 运行测试
运行前需要将OpenCV-MinGW-Build-OpenCV-4.5.0-with-contrib\x64\mingw\bin加入环境变量,如果不想加入环境变量,就将bin文件夹下面的dll文件都复制到opencvtest\build-opcvtest-Desktop_Qt_5_14_2_MinGW_32_bit-Debug\debug下,如果是release运行的,则复制到opencvtest\build-opcvtest-Desktop_Qt_5_14_2_MinGW_32_bit-Release\release下面
测试代码如下
#include "mainwindow.h"#include <QApplication>#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>using namespace cv;int main(int argc, char *argv[])
{QApplication a(argc, argv);Mat img = imread("E:\\work\\HMPTest\\usb_camera\\middleware\\libjpeg-turbo\\src\\testimages\\testimgari.jpg",1);namedWindow("Output",WINDOW_AUTOSIZE);imshow("Output",img);return a.exec();
}
执行结果:
-
问题点:程序没有报错,显示程序异常退出。
-
可能是因为库文件路径问题,检查是否将bin文件加入了环境变量或者将bin文件夹下的dll文件复制到正确的地方。另外注意下载的版本是否正确,我第一次下载的4.5.5那个文件,也出现了这个问题。
-
问题点:显示E:undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&, int)’
-
构建套件选择不匹配,选择了MINGW 64-bit
3 MSVC2017
opencv的官网已经提供了MSCV编译好的库文件,我们只需要根据环境下载对应的文件就好了。
3.1 opencv选择与下载
opencv与msvc的对应关系如下
vc10 = Visual Studio 2010
vc11 = Visual Studio 2012
vc12 = Visual Studio 2013
vc14 = Visual Studio 2015
vc15 = Visual Studio 2017
vc16 = Visual Studio 2019
vc17 = Visual Studio 2022opencv支持情况:
OpenCV2.4.10 支持 VS2010,VS2012,VS2013 (x64,x86)
OpenCV2.4.13 支持 VS2012,VS2013 (x64,x86)
OpenCV3.0 支持 VS2012,VS2013 (x64,x86)
OpenCV3.1 支持 VS2013,VS2015(x64)取消了对32位的支持
OpenCV3.2 支持 VS2015(x64)
OpenCV3.4 支持 VS2015,VS2017(x64)
OpenCV4.1 支持 VS2015,VS2017(x64) 增加了神经网络的支持
OpenCV4.4 支持 VS2015,VS2017(x64)
OpenCV4.5 支持 VS2017,VS2019(x64)
OpenCV4.6 支持 VS2017,VS2019(x64)
OpenCV4.7 支持 VS2019(x64)
OpenCV4.7 支持 VS2022(x64)
我下载的是4.6,因为我电脑上过的是MSVC2017,MSVC2017的安装请参考Ethercat学习-QT添加SOEM主站_qt ethercat-CSDN博客
下载后解压,可以看到包含两个文件夹一个build,一个source,我们要用到的文件就在buiid文件夹下。
3.2 库文件添加
- 新建一个QT工程,建立工程选择的MSVC2017 64-bit。
- 在工程的目录下面新建一个文件夹opencv,用于存放相关文件。
- 复制build\x64\vc15下的lib文件夹至opencv文件夹下面
- 复制build下的include文件夹至opencv文件夹下面
- build\x64\vc15\bin这个文件夹有两种处理方式,第一种:加入系统的环境变量,第二种:复制到我们每一个新建的工程中去,因为我只是这一个项目需要用,所以我用的是第二种方式。
3.3 修改.pro文件
在pro文件中添加如下,导入库文件。
opencv += $$PWD/opencv/INCLUDEPATH += \$${opencv}/IncludeLIBS += \$${opencv}/lib/opencv_world460d.lib
3.4 运行测试
运行前需要将build\x64\vc15\bin加入环境变量,如果不想加入环境变量,就将bin文件夹下面的dll文件都复制到opencvtest\build-opcvtest-Desktop_Qt_5_14_2_MSVC2017_64bit-Debug\debug下,如果是release运行的,则复制到opencvtest\build-opcvtest-Desktop_Qt_5_14_2_MSVC2017_64bit-Release\release下面
测试代码与执行结果请参考 2.4章节。
问题点: 运行时出现global c:\build\master_winpack-build-win64-vc15\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_ 并弹出如下图错误,且图像时黑色的。
网上的解释是因为我们刚开始的时候同时导入了opencv_world460.lib和opencv_world460d.lib。如下所示
opencv += $$PWD/opencv/INCLUDEPATH += \$${opencv}/IncludeLIBS += \$${opencv}/lib/opencv_world460d.lib\$${opencv}/lib/opencv_world460.lib
我们需要在debug的时候使用只opencv_world460d.lib,在release的时候只使用opencv_world460.lib。或者将使用的那个放在前面。最后再重新构建然后运行。
/lib/opencv_world460d.lib
$${opencv}/lib/opencv_world460.lib
我们需要在debug的时候使用只opencv_world460d.lib,在release的时候只使用opencv_world460.lib。或者将使用的那个放在前面。最后再**重新构建**然后运行。