本方法使用的是Win10家庭版操作系统,Qt 5.14,Qt自带的MinGW 32位编译器,编译配置OpenCV 4.12+contrib,来为Qt结合OpenCV开发程序所用。
1.安装应用程序
安装Qt 5.14,在安装时选择MinGW 32位编译器。安装CMake
2.配置系统环境变量
在系统的Path环境变量中,添加MinGW和CMake的相关信息,本系统Qt的安装位置为:D:\Qt\Qt5.14.2\,CMake的安装位置为:D:\Program Files\CMake\,添加结果如下图所示:
3.重启系统,使环境变量配置生效
4.打开CMake进行相关设置
将OpenCV和contrib的文件分别解压缩到桌面,以便于后续操作,分别得到C:\Users\think\Desktop\opencv-4.1.2\和C:\Users\think\Desktop\opencv_contrib-4.1.2\,并在桌面创建C:\Users\think\Desktop\MinGW_build\文件夹,用于保存配置生成的文件。
打开CMake配置目录如下:
点击Configure按钮进行如下配置:
其中C栏对应的文件路径为D:/Qt/Qt5.14.2/Tools/mingw730_32/bin/gcc.exe,C++栏对应的文件路径为D:/Qt/Qt5.14.2/Tools/mingw730_32/bin/g++.exe
不要在设置目录的时候,包含有c++命名的文件目录,否则会出错。
点击Finish按钮得到如下界面:
其中WITH分组各选项对应的含义如下:
WITH分组
(1)WITH_1394:提供对1394接口的相机驱动支持
(2)WITH_ADE:gapi模块的编译依赖于ADE
(3)WITH_ARITH_DEC:libjpeg模块依赖它
(4)WITH_ARITH_ENC:libjpeg模块依赖它
(5)WITH_CLP:CLP是开源的线性规划程序求解器
(6)WITH_CUDA:提供对加速并行计算CUDA包的支持
(7)WITH_DIRECTX:DirectX是微软做的一个超大的多媒体处理合集,包括音频和视频处理等功能
(8)WITH_DSHOW:DirectShow是微软公司开发的新一代基于COM的流媒体处理的开发包,与DirectX开发包一起发布
(9)WITH_EIGEN:Eigen是支持线性代数、矩阵、矢量运算、数值分析的库,使用该选项OpenCV只是提供了与Eigen的转换接口,并没有什么性能效果
(10)WITH_FFMPEG:FFmpeg是一套可以用来记录、转换数字音频、视频,并将其转换为流的开源程序,其在Linux下开发
(11)WITH_GDAL:GDAL是一个在X/MIT许可协议下的开源栅格空间数据转换库,很多著名的GIS(地理信息系统)类产品都使用GDAL库
(12)WITH_GDCM:DICOM即医学数字成像和通信,是医学图像和相关信息的国际标准,其定义了质量能满足临床需要的可用于数据交换的医学图像格式,被广泛应用于X射线、CT、核磁共振、超声等设备
(13)WITH_GSTREAMER:GStreamer是用来构建流媒体应用的开源多媒体框架,其目标是简化音/视频应用程序的开发,在Linux平台下开发
(14)WITH_HALIDE:Halide是用C++作为宿主的图像处理DSL语言,其特点是其图像算法的计算实现和这些计算在计算硬件单元上的调度是分离的,最终将整个图像算法转换为高效率的多层for循环,其能支持的硬件包括CPU、GPU、DSP、FPGA和ASIC
(15)WITH_HPX:HPX是用于任何规模的并行和分布式应用的C++标准库
(16)WITH_IMGCODEC_HDR:提供HDR(高动态范围图像)的支持
(17)WITH_IMGCODEC_PFM:提供PFM(一种浮点像素的图像格式,包含文件信息和文件二进制数据两部分内容)格式文件的支持
(18)WITH_IMGCODEC_PXM:提供PNM(包括PPM、PGM、PBM是跨平台的图像格式)格式文件的支持和PAM(一种动画图像文件格式)格式文件的支持
(19)WITH_IMGCODEC_SUNRASTER:提供Sun Raster(一种流行的图像文件格式)格式文件的支持
(20)WITH_INF_ENGINE:提供Intel的推理引擎支持,其基于强劲的GPU和CPU计算资源,为用户提供AI模型部署和模型推理服务,用于DNN模块可提高处理速度
(21)WITH_IPP:提供Intel IPP支持,其是一套跨平台的软件函数库,提供广泛的多媒体功能:音频解码、图像处理、信号处理、语音压缩等
(22)WITH_ITT:提供Intel的仪器和跟踪技术(ITT)支持,使你的应用程序能在执行期间生成和控制跟踪数据的收集
(23)WITH_JASPER:提供JPEG2000支持
(24)WITH_JPEG:提供JPEG支持
(25)WITH_LAPACK:提供LAPACK库支持,其包含求解科学与工程计算中最常见的数值线性代数问题,如求解线性方程组、线性最小二乘、特征值、奇异值等问题,是一自动并行化优化工具
(26)WITH_LIBREALSENSE:提供Intel的RealSense SDK支持,其是对RealSense深度摄像机和跟踪相机,提供深度和颜色流,及内部和外部校准信息
(27)WITH_MATLAB:提供MATLAB支持(OpenCV contrib)
(28)WITH_MSMF:提供基于Media Foundation的VideoIO支持,用于视频流处理
(29)WITH_MSMF_DXVA:在Media Foundation后端使能硬件加速
(30)WITH_OPENCL:提供OpenCL运行时支持,是面向异构系统通用目的的并行编程的开放式标准,便于软件人员为高性能计算服务器、桌面计算系统和手持设备编写高效轻便的代码,广泛用于多核处理器(CPU)、GPU、Cell类型架构和DSP等其他并行处理器
(31)WITH_OPENCLAMDBLAS:提供AMD OpenCL BLAS库支持
(32)WITH_OPENCLAMDFFT:提供AMD OpenCL FFT库支持
(33)WITH_OPENCL_D3D11_NV:提供NVIDIA OpenCL D3D11支持,D3D11是Direct3D 11的简写,其是微软为游戏、科学和桌面应用创建三维图形提供SDK
(34)WITH_OPENCL_SVM:提供OpenCL的共享虚拟内存支持,其是由于使用OpenCL在CPU和GPU之间进行数据传输时非常耗时,为了解决该瓶颈,通过SVM技术提供不需要数据拷贝的数据共享,从而加速处理(但有国内人员进行测试并没有什么加速效果)
(35)WITH_OPENEXR:通过OpenEXR(一种开放标准的高动态范围图像格式,在计算机图形学中被广泛用于存储图像数据)提供ILM(工业光魔,是著名的电影特效制作公司)支持
(36)WITH_OPENGL:提供OpenGL(开放式图形库)支持,是用于渲染2D、3D矢量图形和三维景象的跨语言和跨平台应用程序编程接口,其常被用于CAD、虚拟现实、科学可视化和电子游戏开放
(37)WITH_OPENMP:提供OpenMP支持,是用于共享内存并行系统的多处理器程序设计的编译处理方案(在OpenCV2.3版本后抛弃OpenMP转向TBB)
(38)WITH_OPENNI:提供OpenNI(开放自然交互和三维感知)支持,其是跨语言和跨平台的框架的通用自然交互应用接口,是用于搭建视觉和音频传感器与视觉和音频感知中间件通信的桥梁
(39)WITH_OPENNI2:提供OpenNI2支持,其是OpenNI的第二代,更加专注于对3D设备的支持和数据获取,移除了手势识别等中间件方式
(40)WITH_OPENVX:提供OpenVX支持,其是跨平台计算机视觉应用加速的标准,其实现了计算机视觉处理中性能和能耗方面的优化,特别是在嵌入式和实时应用案例中起重要作用
(41)WITH_PNG:提供PNG支持
(42)WITH_PROTOBUF:使能libprotobuf,其是Google开发的跨语言和跨平台的协议缓冲区库,用于序列化结构化数据
(43)WITH_PTHREADS_PF:使用基于pthreads的并行化,主要用于Linux系统
(44)WITH_PVAPI:提供Prosilica GigE支持,Prosilica是加拿大的一家工业相机公司,GigE是千兆以太网标准接口
(45)WITH_QT:建立与Qt后端的支持
(46)WITH_QUIRC:提供QR码解码库支持
(47)WITH_TBB:提供Intel TBB支持,其是使用ISO C++代码实现的跨平台可扩展的并行编程库
(48)WITH_TESSERACT:提供Tesseract OCR库支持,其是Google发布的开源OCR识别引擎
(49)WITH_TIFF:提供TIFF(标签图像文件格式)支持
(50)WITH_VTK:提供VTK库支持(用于建立opencv_viz模块),其是跨平台的,主要用于三维计算机图形学、图像处理和可视化
(51)WITH_VULKAN:提供Vulkan支持,其是跨平台的2D和3D绘图应用程序接口,类似于OpenGL,主要针对3D程序(电子游戏)设计
(52)WITH_WEBP:提供WebP支持,其是一种同时提供有损压缩和无损压缩的图片文件格式
(53)WITH_WIN32UI:使用win32 UI后端建立支持
(54)WITH_XIMEA:提供XIMEA摄像机支持,XIMEA是德国的一家工业相机公司
在Ungrouped Entries中有一个OpenCV_HAL_DIR,该项与所谓的HAL(硬件加速层)实现相关,但介质2020.03,使用HAL的代码尚不完善,因此无需选择
在OPENCV中有一个OPENCV_FORCE_3RDPARTY_BUILD,网上查无相关资料,因此暂不是选择。
取消勾选WITH_IPP,同时勾选WITH_OPENGL和WITH_QT。
虽然勾选WITH_OPENCLAMDBLAS,但由于网上无法查找有效的配置方法,因此会显示该相关内容未找到,该勾选基本无效。
相比默认设置,还取消勾选了WITH_1394,WITH_EIGEN,WITH_LAPACK,WITH_TESSERACT。确保WITH_OPENCL被勾选且有效。
由于只使用OpenCV的C++功能,BUILD分组中进行如下修改:
取消勾选BUILD_EXAMPLES、BUILD_JAVA、BUILD_opencv_java_bindings_generator、BUILD_opencv_python_bindings_generator、BUILD_opencv_python_test,不要勾选BUILD_opencv_world
OPENCV分组中进行如下修改:
勾选OPENCV_ENABLE_NONFREE,OPENCV_EXTRA_MODULES_PATH选择C:/Users/think/Desktop/opencv_contrib-4.1.2/modules并按回车
点击Configure按钮进行一次刷新,此时应该在配置信息栏还是红色。
此时由于配置了使用FFMPEG和OpenCV contrib的xfeatures2d和face模块,此时进行配置会显示缺少相关文件,且下载失败导致整个编译失败。
此时需下载以下文件:
(1)opencv_ffmpeg.dll,opencv_ffmpeg_64.dll,ffmpeg_version.cmake
(2)boostdesc_bgm.i,boostdesc_bgm_bi.i,boostdesc_bgm_hd.i,boostdesc_binboost_064.i,boostdesc_binboost_128.i,boostdesc_binboost_256.i,boostdesc_lbgm.i,vgg_generated_48.i,vgg_generated_64.i,vgg_generated_80.i,vgg_generated_120.i
(3)face_landmark_model.dat
然后进行以下操作:
(1)确保C:\Users\think\Desktop\MinGW_build\3rdparty\ffmpeg\文件夹下包含如图所示的文件:
(2)使用上述(1)中文件替换C:\Users\think\Desktop\opencv-4.1.2.cache\ffmpeg\中的文件,使原来的大小为0的文件被替换为不为0的文件,文件名仍按照原来系统自动生成的MD5哈希码值的文件名,如下图:
(3)将上述(2)中的所有文件复制到C:\Users\think\Desktop\opencv_contrib-4.1.2\modules\xfeatures2d\src\文件夹下
(4)将上述(2)中的boostdesc_bgm.i,boostdesc_bgm_bi.i,boostdesc_bgm_hd.i,boostdesc_binboost_064.i,boostdesc_binboost_128.i,boostdesc_binboost_256.i,boostdesc_lbgm.i文件复制到C:\Users\think\Desktop\opencv-4.1.2.cache\xfeatures2d\boostdesc\文件夹下,使原来的大小为0的文件被替换为不为0的文件,文件名仍按照原来系统自动生成的MD5哈希码值的文件名,如下图:
(5)将上述(3)中的所有文件复制到C:\Users\think\Desktop\opencv_contrib-4.1.2\modules\face\src\文件夹下
重新点击Configure按钮进行刷新,直到状态栏所有状态都变为白色,且在输出信息栏使用Goto Next Error查找无警告无错误为止。
点击Generate按钮生成编译文件。关闭CMake。
在C:\Users\think\Desktop\opencv-4.1.2\cmake\文件中找到OpenCVCompilerOptions.cmake文件,使用笔记本打开,找到add_extra_compiler_option(-Werror=non-virtual-dtor)语句,在其前面加#注释掉,为生成做准备。
5.打开cmd.exe,切换到C:\Users\think\Desktop\MinGW_build\目录,输入
mingw32-make语句进行生成。
整个生成过程大约需要1.5h。
再输入mingw32-make install进行安装,到此就安装完成。
如果出现以下错误:
CMake Error at modules/videoio/cmake_install.cmake:79 (file):
file INSTALL cannot find
"C:/Users/think/Desktop/MinGW_build/3rdparty/ffmpeg/opencv_videoio_ffmpeg.dll":File exists.Call Stack (most recent call first):modules/cmake_install.cmake:139 (include)cmake_install.cmake:105 (include)mingw32-make: *** [Makefile:157: install] Error 1
则将opencv_videoio_ffmpeg.dll文件复制到C:/Users/think/Desktop/MinGW_build/3rdparty/ffmpeg/文件夹下,重新进行安装。
安装完成后,整个MinGW_build文件夹有1.5G,其中只有\MinGW_build\install\文件夹内的内容有用,其他都可以删除。
6.为Qt配置OpenCV
将C:\Users\think\Desktop\MinGW_build\install\文件夹复制到其他位置,并重命名以便于后续软件开发使用。这里我将其复制并重命名为D:\opencv_mingw_lib\。
在该文件夹下使用记事本新建一个opencv.pri文件,内容如下:
INCLUDEPATH += D:/opencv_mingw_lib/include/LIBS += D:/opencv_mingw_lib/x86/mingw/lib/libopencv_*.a
在系统的Path环境变量中,添加OpenCV相关DLL的信息,加结果如下图所示:
重启计算机使环境变量配置生效。
此后再开发基于Qt的OpenCV项目时,只需在项目的*.pro文件的最后添加如下内容:
win32: {include("D:/opencv_mingw_lib/opencv.pri")
}
即会在项目中包含之前创建的opencv.pri文件,然后在相关代码文件中添加OpenCV头文件引用,即可实现OpenCV的调用。