OpenCV编译(CMake方式/Win环境)错误处理、VS编译环境配置、Python相关包安装
编译方式:CMake
环境:Windows 10
主要用于:Python开发 +Visual Studio C++开发(如果要用Qt开发,请看我的另一篇文章)
一、 CMake编译 OpenCV 错误处理
1. 部分文件联网下载失败导致opencv过不了cmake
问题描述:configure报错:IPPICV: Hash mismatch
一、ippicv_2020_win_intel64_20191018_general.zip下载失败
方法一、
进入opencv3.4.2\sources\3rdparty\ippicv目录
将 ippicv.cmake 的https://raw.githubusercontent.com
修改为:https://raw.staticdn.net
方法二、直接去网址下载:
直接搞可能需要FQ,推荐使用https://ghproxy.com/
解决方案:参考
打开E:\Tools\OpenCV\OpenCV-4.5.5-Build文件夹下的CMakeDownloadLog.txt找到
#do_unpack "ippicv_2020_win_intel64_20191018_general.zip" "879741a7946b814455eee6c6ffde2984" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_win_intel64_20191018_general.zip" "E:/Tools/OpenCV/OpenCV-4.5.5-Build/3rdparty/ippicv"
#check_md5 "E:/Tools/OpenCV/opencv-4.5.5/.cache/ippicv/879741a7946b814455eee6c6ffde2984-ippicv_2020_win_intel64_20191018_general.zip"
可以从中找到下载地址为:https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_win_intel64_20191018_general.zip
,
在https://ghproxy.com/的搜索框输入即可下载
下载完成后,重命名为879741a7946b814455eee6c6ffde2984-ippicv_2020_win_intel64_20191018_general.zip
,最后将重命名后的文件放入E:\Tools\OpenCV\opencv-4.5.5.cache\ippicv中
重新configure。
下面的二、三、四、五等文件下载失败,同样适用两种方法。
二、opencv_videoio_ffmpeg_64.dll、opencv_videoio_ffmpeg.dll下载失败
进入opencv3.4.2\sources\3rdparty\ffmpeg目录
将 ffmpeg.cmake 的https://raw.githubusercontent.com
修改为:https://raw.staticdn.net
三、boostdesc_bgm.i相关文件下载失败
进入opencv_contrib-3.4.2\modules\xfeatures2d\cmake目录
将 download_boostdesc.cmake中的https://raw.githubusercontent.com
修改为:https://raw.staticdn.net
四、vgg_generated_120.i相关文件下载失败
进入opencv_contrib-3.4.2\modules\xfeatures2d\cmake目录
将 download_vgg.cmake中的https://raw.githubusercontent.com
修改为:https://raw.staticdn.net
五、face_landmark_model.dat下载失败
修改.\opencv_contrib-3.4.2\modules\face\CMakeLists.txt,
将https://raw.githubusercontent.com
修改为:https://raw.staticdn.net
之后重新configure即可。一次不行,多试几次。
2. ModuleNotFoundError: No module named 'numpy.distutils'
解释:
ModuleNotFoundError: No module named 'numpy.distutils'
表示 Python 无法找到名为 numpy.distutils
的模块。这通常是因为 numpy
没有正确安装,或者安装的 numpy
版本不包含 distutils
子模块。
解决方法:
-
确认
numpy
是否已安装:在命令行中运行pip show numpy
查看numpy
是否已安装以及其版本信息。 -
如果未安装,使用
pip install numpy
安装numpy
。 -
如果已安装,但问题仍然存在,可能是
numpy
安装不正确或损坏。尝试重新安装numpy
:pip uninstall numpy
然后pip install numpy
。 -
确保使用的 Python 环境是正确的,如果在虚拟环境中工作,确保虚拟环境已激活。
-
如果问题依旧,可能是 Python 环境中存在多个版本的
numpy
,检查sys.path
确认导入的是预期的numpy
版本。
3.OpenCV does not recognize MSVC_VERSION "1938". Cannot set OpenCV_RUNTIME
解释:
这个错误表明你的OpenCV库不能识别版本号“1938”,这通常是因为Visual Studio的版本号与OpenCV的MSVC_VERSION设置不匹配。MSVC_VERSION是一个环境变量,用于指定使用的Microsoft Visual C++编译器的版本。
opencv3.3.1的版本大约是在2017年,这时候VS2019还没有出来吧,对应的微软内部ID版本号,自然是没有出来,我们只要稍微改一下配置的Makefile就可以了:
解决方法:
- 确认你安装的Visual Studio版本。通常,Visual Studio的版本号是一个四位数,例如“1600”代表Visual Studio 2010,“1900”代表Visual Studio 2015,“1910”代表Visual Studio 2017,“1920”代表Visual Studio 2019,且随着每个主要版本的发布而增加
- 如果你使用的是Visual Studio 2019,那么正确的MSVC_VERSION应该是“1928”(对于Visual Studio 2019版本16.8)或更高。
- 我用的是Visual Studio 2022,MSVC_VERSION=1938,对应vc版本为17
- 打开
opencv331/opencv/cmake/OpenCVDetectCXXCompiler.cmake
,添加以下内容
4. Visual Studio2022 编译报错“hash_compare”: 未定义基类
\opencv-3.4.19\3rdparty\protobuf\src\google/protobuf/stubs/hash.h(255,14): error C2504: “hash_compare”: 未定义基类
解释:VS2022版本太新,/hash.h
文件对于VS2022 不支持。
解决办法:
打开上面文件\opencv-3.4.19\3rdparty\protobuf\src\google/protobuf/stubs/hash.h
,然后定位到_MSC_VER
,修改成以下内容。
#elif defined(_MSC_VER)
# if _MSC_VER >= 1900 // Since Visual Studio 2022
# define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
# include <hash_map>
# define GOOGLE_PROTOBUF_HAS_CXX11_HASH
# define GOOGLE_PROTOBUF_HASH_COMPARE stdext::hash_compare
# elif _MSC_VER >= 1600 // Since Visual Studio 2010
二、VS编译环境配置
(7:PATH设置为你的openc_cv install目录下的bin文件夹,对我来说,就是E:\Qt_Opencv_Build\3-opencv_contrib\opencv-4.5.2\build-for-py\install\x64\vc17\bin
测试程序:
#include <opencv2/opencv.hpp>
#include <opencv2/core/utils/logger.hpp>//日志头文件
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
//utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//不输出日志
//utils::logging::setLogLevel(utils::logging::LOG_LEVEL_ERROR);//只输出错误日志
Mat src = imread("C:/Users/12421/Desktop/Lena.jpg");
if (src.empty())
{
cout << "please cheak image path" << endl;
return -1;
}
Mat src_x, src_y, src_xy;
flip(src, src_x, 0);//沿x轴对称
flip(src, src_y, 1);//沿y轴对称
flip(src, src_xy, -1);//沿x轴对称,沿y轴对称
imshow("src", src);
imshow("src_x", src_x);
imshow("src_y", src_y);
imshow("src_xy", src_xy);
waitKey(0);
return 0;
}
三、Python相关包安装
在安装好python 和 pip 之后,安装以下包:
python -m pip install numpy matplotlib opencv-python
参考资料:
1、 《编译Opencv3.3.1遇到的编译器无法识别的警告的问题解除:》https://blog.csdn.net/yellow_hill/article/details/135941157
2、《部分文件联网下载失败导致opencv过不了cmake解决办法》https://blog.csdn.net/weixin_42386056/article/details/105576333
3. 《cmake解决opencv编译失败》:https://blog.csdn.net/weixin_44733606/article/details/131721057
4. 《Visual Studio 2022配置OpenCV455+CMake(Win11)》https://blog.csdn.net/qq_44658189/article/details/125030551
推荐:很全面的文章,尤其很好地解决了“ippicv:hash notmatch”的问题。
5. 《/protobuf/stubs/hash.h(242,2)》原文链接:https://blog.csdn.net/durongze/article/details/134439134
推荐:解决了Visual Studio 2022编译ALL BUILD时出现的问题。