环境 Windows10/Windows11
1.安装QT
下载地址:Index of /archive/qt
推荐下载5.14.1
这里拿5.14.0做示例
如果不想注册可以打开程序之前把网关掉
2.安装CMake
下载地址:Download | CMake
3.安装Python
下载地址:python.org/downloads/windows/
4.下载OpenCV
下载地址:https://github.com/opencv/opencv/releases/tag/4.2.0
Release 4.2.0 · opencv/opencv_contrib · GitHub
5.添加环境变量
6.编译前准备
1.准备目录
(1)在D:盘根目录下新建OpenCV_4.2.0-Source文件夹,将下载得到的OpenCV库的opencv-4.2.0.zip包解压,将得到的所有文件复制到该文件夹。
(2)在D:盘根目录下新建Contrib_4.2.0-Source文件夹,将下载得到的Contrib扩展库的opencv_contrib-4.2.0.zip包解压,将得到的所有文件复制到该文件夹。
(3)在D:盘根目录下再新建一个OpenCV_4.2.0-Build文件夹,用于存放编译后生成的文件和库。
2.改动源文件
1.改动OpenCV_4.2.0-Source\modules\videoio\src\cap_dshow.cpp
增加宏定义“#define STRSAFE_NO_DEPRECATE”
2.改动OpenCV_4.2.0-Source\modules\photo\test\test_hdr.cpp
增加头文件包含“#include <ctime>”和“#include <cstdlib>”
7.编译配置
打开CMake(cmake-gui)
设置好路径后,单击左下角的“Configure”按钮
选择C编译程序的路径为D:\Qt\Qt5.14.1\Tools\mingw730_32\bin\ gcc.exe;
选择C++编译程序的路径为D:\Qt\Qt5.14.1\Tools\mingw730_32\bin\g++.exe。
再次单击左下角的“Configure”按钮
随后,在主界面中央生成了一系列红色加亮选项条的列表,同时下方信息栏中输出“Configuring done”,表示编译器配置完成
这些红色加亮的选项并非都是必须编译的功能,要确保选中“WITH_OPENGL”和“WITH_QT”这两个编译选项。同时,要确保取消勾选“WITH_MSMF”编译选项
另外,为了将Contrib扩展库与OpenCV无缝整合,还需要设置OpenCV的外接模块路径,从众多的红色加亮选项条中找到一个名为“OPENCV_EXTRA_MODULES_ PATH”的选项,设置其值为“D:/Contrib_4.2.0-Source/modules”
设置完成后,再次单击“Configure”按钮,界面上的红色加亮的选项全部消失,若没有全部消失再点击“Configure”。
单击“Generate”,同时在下方信息栏中输出“Generating done”表示编译选项全部配置完成
8.开始编译
所有的设置项都完成后,就可以开始编译了。
打开D:\OpenCV_4.2.0-Build\,点击Shift+右键,打开Powershell
输入编译命令mingw32-make编译
如果电脑性能好可以用多线程 mingw32-make -j4
在进度显示100%时,出现“Built target opencv_version_win32”信息,表示编译成功。
9.安装OpenCV库
编译完成的OpenCV库必须在安装后才能使用,在命令行中输入:mingw32-make install
命令窗口中输出安装过程及进度,安装过程比编译过程要快得多,很快就能安装好
此时,打开D:\OpenCV_4.2.0-Build文件夹,可以发现其下已经编译生成了很多文件
其中有一个名为“install”的子目录,进入其中即“D:\OpenCV_4.2.0-Build\install\x86\mingw\ bin”下的所有文件就是编译安装好的OpenCV库文件,将它们复制到Qt项目的Debug目录下就可以使用了。
10.编译时出错解决
1.问题1:Contrib_4.2.0-Source\modules\rgbd\src\dynafu.cpp:230:5: error: there are no arguments to 'glGenRenderbuffersEXT' that depend on a template parameter, so a declaration of 'glGenRenderbuffersEXT' must be available [-fpermissive]
glGenRenderbuffersEXT(1, &fbo_depth);
^~~~~~~~~~~~~~~~~~~~~
解决:
添加代码:(下载更改后的dynafu.cpp:GitHub - alexfuyi/OpenCV4.2.0)
// GL Extention definitions missing from standard Win32 gl.h
#if defined(_WIN32) && !defined(GL_RENDERBUFFER_EXT)
#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
#define GL_FRAMEBUFFER_EXT 0x8D40
#define GL_RENDERBUFFER_EXT 0x8D41
namespace {
PROC _wglGetProcAddress(const char *name)
{
auto proc = wglGetProcAddress(name);
if (!proc)
CV_Error(cv::Error::OpenGlApiCallError, cv::format("Can't load OpenGL extension [%s]", name) );
return proc;
}
void glGenFramebuffersEXT(GLsizei n, GLuint *framebuffers)
{
static auto proc = reinterpret_cast<void(*)(GLsizei, GLuint*)>(_wglGetProcAddress(__func__));
proc(n, framebuffers);
}
void glGenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers)
{
static auto proc = reinterpret_cast<void(*)(GLsizei, GLuint*)>(_wglGetProcAddress(__func__));
proc(n, renderbuffers);
}
void glBindRenderbufferEXT(GLenum target, GLuint renderbuffer)
{
static auto proc = reinterpret_cast<void(*)(GLenum, GLuint)>(_wglGetProcAddress(__func__));
proc(target, renderbuffer);
}
void glBindFramebufferEXT(GLenum target, GLuint framebuffer)
{
static auto proc = reinterpret_cast<void(*)(GLenum, GLuint)>(_wglGetProcAddress(__func__));
proc(target, framebuffer);
}
void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
{
static auto proc = reinterpret_cast<void(*)(GLenum, GLenum, GLenum, GLuint)>(_wglGetProcAddress(__func__));
proc(target, attachment, renderbuffertarget, renderbuffer);
}
void glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
{
static auto proc = reinterpret_cast<void(*)(GLenum, GLenum, GLsizei, GLsizei)>(_wglGetProcAddress(__func__));
proc(target, internalformat, width, height);
}
} // anonymous namespace
#endif // defined(_WIN32) && !defined(GL_RENDERBUFFER_EXT)
2.问题2:D:\Contrib_4.2.0-Source\modules\xfeatures2d\src\boostdesc.cpp:654:20: fatal error: boostdesc_bgm.i: No such file or directory
#include "boostdesc_bgm.i"
^~~~~~~~~~~~~~~~~
解决:把GitHub - alexfuyi/OpenCV4.2.0上的.i文件复制到D:\Contrib_4.2.0-Source\modules\xfeatures2d\src\
3.问题3:D:\Contrib_4.2.0-Source\modules\xfeatures2d\test\test_features2d.cpp:51:10: fatal error: features2d/test/test_detectors_regression.impl.hpp: No such file or directory
#include "features2d/test/test_detectors_regression.impl.hpp"
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解决:找到D:\Contrib_4.2.0-Source\modules\xfeatures2d\test\test_features2d.cpp和 D:\Contrib_4.2.0-Source\modules\xfeatures2d\test\test_rotation_and_scale_invariance.cpp
把引用头文件的test_detectors_invariance.impl.hpp,test_descriptors_invariance.impl.hpp,test_detectors_regression.impl.hpp,test_descriptors_regression.impl.hpp
改成绝对路径,如:
#include "D:/OpenCV_4.2.0-Source/modules/features2d/test/test_detectors_regression.impl.hpp"
#include "D:/OpenCV_4.2.0-Source/modules/features2d/test/test_descriptors_regression.impl.hpp"
#include "D:/OpenCV_4.2.0-Source/modules/features2d/test/test_detectors_invariance.impl.hpp"
#include "D:/OpenCV_4.2.0-Source/modules/features2d/test/test_descriptors_invariance.impl.hpp"