windows:Opencv使用Cmake & VS 编译, C++、python、Cuda、Qt 环境详细教学及踩坑 二 :测试篇
windows:Opencv使用Cmake & VS 编译, C++、python、Cuda、Qt 环境详细教学及踩坑 二 :测试篇
Last edited time: July 21, 2024 4:15 PM
求赞求赞求赞,若对你产生帮助,鼓励一下
🎾 本篇文章承接上文:编译安装篇,对编译完成的opencv库进行验证测试
上文链接:
windows:Opencv使用Cmake & VS 编译, C++、python、Cuda、Qt 环境详细教学及踩坑 一 :编译篇
一、VS studio 测试
0、参考:
VS2019+OpenCV安装与配置教程
1、新建cpp项目
1、打开Visual Studio,新建一个C++项目。
添加cpp文件:右键点击源文件,添加新建项
点击添加
2、配置“属性管理器”。
点击 视图 ——> 其他窗口 ——> 属性管理器 ——> 右键属性管理器窗口 ——>添加新项目属性表
🎾 注意:此次的保存位置建议自己指定,保存好已设置好的属性表,以后新建项目时,可以很方便的添加现有属性表:找到该指定的保存位置,导入已经设置好的属性表。
2、右键属性管理器窗口——>点击属性
点击VC++目录——> 编辑包含目录
1、添加包含目录:
将添加 install下的include 文件夹(本文将opencv/build/install 文件夹按习惯重命名为opencv_410_cp312_amd64)
2、添加库目录
添加opencv install/x64/vc17/lib
3、添加依赖项:
1、debug模式下添加 opencv_worldd.lib (结尾带d的lib)*
2、release 模式下添加opencv_world*.lib 结尾不带d的lib**
🚅 注意:此.lib文件名含义4100为opencv版本号4.10,具体本地的编译版本请在install\x64\vc17\lib
下查看。
🎾 两个文件必须分别在不同模式下添加,不能都添加到一个模式下,否则由于前后的优先级问题,切换模式会报错。
opencv_world4100.lib :为release 文件,该文件只能在release 模式下运行
opencv_world4100d.lib :为debug 文件,该文件只能在debug模式下运行
点击确定
3、cpp测试代码
(查看cv和cv_contrib是否均编译成功)
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
//OpenCV版本号
cout << "OpenCV_Version: " << CV_VERSION << endl;
//读取图片
std::string image_path = "D:\\Project\\dataset\\IRSDT_infrared\\Images\\4\\014.bmp";
// 打印当前图片位置
std::cout << "Current path: " << image_path << std::endl;
Mat img = imread(image_path);
cv::Ptr<cv::xfeatures2d::SURF> detector = cv::xfeatures2d::SURF::create(400);
std::vector<cv::KeyPoint> keypoints;
cv::Mat descriptors;
detector -> detectAndCompute(img, cv::noArray(), keypoints, descriptors);
// 在图像上绘制关键点
cv::Mat img_keypoints;
cv::drawKeypoints(img, keypoints, img_keypoints);
// 显示结果
imshow("picture", img);
cv::imshow("SURF Keypoints", img_keypoints);
cv::waitKey(0);
return 0;
}
4、测试
添加代码,将路径修改为自己计算机上某一张图片的路径
1、以debug 模式尝试运行
运行成功!!
2、以release模式尝试运行
运行成功!!
注意事项
1、切换模式后,报错
解决方法:
请右键该项目,点击清理后重新运行
2、添加依赖性时的问题
大多数blog都是将opencv_worldd.lib和opencv_world.lib都添加到全部配置下的依赖项下,或者只添加其中一个。这种做法是错误的,否则只能运行debug或release其中一个模式。
🎾 两个文件必须分别在不同模式下添加,不能都添加到一个模式下,否则由于前后的优先级问题,切换模式会报错。
opencv_world4100.lib :为release 文件,该文件只能在release 模式下运行
opencv_world4100d.lib :为debug 文件,该文件只能在debug模式下运行
二、pycharm 测试
1、使用python系统解释器测试:
1、准备
1、修改config.py文件中的install 路径
首先修改本机 python安装路径\Python312\Lib\site-packages\cv2 的config.py文件。将该路径改为cmake 编译好的opencv/build下的 install 路径
2、选择 python系统解释器
打开pycharm 设置,点击 python解释器,点击 添加解释器, 点击 系统解释器
注意:此处仔细查看python的路径,务必选择计算机安装路径下的python,而不是anaconda下的python。
3、安装numpy
若系统解释器下没有安装numpy,打开cmd,输入
pip install numpy
注意:此处 不能有conda环境的前缀,即使是base也不可以,否则的话,numpy会安装到conda的虚拟环境下而不是系统的python环境。如果存在conda环境 前缀,请输入
conda deactivate
2、python 测试代码
import cv2
# 读取图像
image_path = '0.bmp'
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 初始化SURF
hessian_threshold = 400
surf = cv2.xfeatures2d.SURF_create(hessian_threshold)
# 检测关键点和计算描述符
keypoints, descriptors = surf.detectAndCompute(gray, None)
# 在图像上绘制关键点
img_with_keypoints = cv2.drawKeypoints(img, keypoints, None, (255, 0, 0), 4)
cv2.imshow('keypoints', img_with_keypoints)
cv2.waitKey(0)
3、python 系统解释器测试
将上述代码导入,修改image_path为本机的一张图片路径测试成功!!!
2、在conda环境下测试:
1、使用conda环境
🎾 新建conda环境时请指定python版本,务必与cmake python编译版本相同,或者使用与cmake
编译python版本相同的conda环境
conda create -n cv_test python=3.** #创建conda环境
conda activate cv_test # 激活conda环境
pip install numpy # 安装numpy
2、opencv 软连接
windows下将本机下的系统python环境软连接到conda虚拟环境中。输入以下命令
mklink
mklink /j "C:\ProgramData\anaconda3\envs\cv_test\Lib\site-packages\cv2" "C:\Program Files\Python312\Lib\site-packages\c
注:mklink说明
链接成功
3、import opencv 失败
此时尝试启动一下opencv
python # 启动pyhton
import cv2
报错:
ImportError: DLL load failed while importing cv2: 动态链接库(DLL)初始化例程失败。
参考链接:https://github.com/opencv/opencv/issues/25689#issuecomment-2153269837
原因:
默认的vc库过旧,没有升级为vs2022最新版本
4、解决办法:
conda环境中安装最新版的vc_runtime
exit() # 退出python环境
conda install conda-forge::vc14_runtime
5、重新尝试测试 opencv
成功!!!
打开pycharm测试:
将python解释器修改为新建conda环境下的解释器
运行成功!!!
3、Qt 测试
🎾 注意:本文Qt使用的kit仅有msvc,而不是minGW,所以此教程仅适用于MSVC kit。请注意自己Qt项目使用的kit。
1、Cmake +msvc 测试
1、新建Qt项目
2、构建系统选择cmake
3、构建套件选择MSVC,下一步到完成
4、创建opencv_config.cmake
在自己指定的任意位置新建opencv_config.cmake文件(新建txt,修改txt的拓展名即可),该文件方便以后Qt导入,文件存放路径便于自己查找。
🎾 注意:路径中有空格的必须使用双引号,为避免意外,建议路径都使用双引号,下文所有的步骤同理
粘贴下列代码,代码中的路径改为自己opencv的install的路径(笔者此外将install重命名了)
# opencv_config.cmake
# 设置 OpenCV 路径
set(OpenCV_DIR "D:/Program Files/opencv/opencv_410_cp312_amd64")
# 查找 OpenCV 包
find_package(OpenCV REQUIRED)
# 检查 OpenCV 是否找到
if (OpenCV_FOUND)
message(STATUS "OpenCV version: ${OpenCV_VERSION}")
else()
message(FATAL_ERROR "OpenCV not found.")
endif()
# 将 OpenCV 的包含目录和库目录传递到主 CMakeLists.txt
set(OPENCV_INCLUDE_DIRS ${OpenCV_INCLUDE_DIRS})
set(OPENCV_LIBS ${OpenCV_LIBS})
5、编辑cmakelist.txt 文件
返回Qt编辑cmakelist.txt 文件,该路径为opencv_config.cmake的路径
# 1、在如图所示位置增加include
include("D:\\Program Files\\opencv\\opencv_Qt_msvc.cmake")
# 2、在target_link_libraries(cv_test PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
#中增加 ${OpenCV_LIBS} 为
target_link_libraries(cv_test PRIVATE Qt${QT_VERSION_MAJOR}::Widgets ${OpenCV_LIBS})
6、测试
测试代码与VS测试部分的cpp代码相同,删除原来main.cpp中的所有代码,粘贴为该代码。点击运行
成功!!
2、Qmake + msvc测试
0、参考
Windows上Qt配置OpenCV(最简单版本无需自己编译-避坑必看)
1、新建Qt项目
2、构建系统选择Qmake
3、构建套件选择MSVC,下一步到完成
4、创建prj文件
在自己指定的任意位置新建 opencv_config.prj 文件(新建txt,修改txt的拓展名即可),该文件方便以后Qt导入,文件存放路径便于自己查找。
粘贴下列代码,代码中的路径改为自己opencv的install中的路径(笔者此外将install重命名了)
INCLUDEPATH += "D:\\Program Files\\opencv\\opencv_410_cp312_amd64\\include"
Debug: {
LIBS += -l"D:\\Program Files\\opencv\\opencv_410_cp312_amd64\\x64\\vc17\\lib\\opencv_world4100d"}
Release: {
LIBS += -l"D:\\Program Files\\opencv\\opencv_410_cp312_amd64\\x64\\vc17\\lib\\opencv_world4100"
}
🎾 **注意:cmake使用MinGW编译产生的lib文件为libopencv_*.a,而msvc为opecv_*.lib,所以有的教程在此处添加的是libopencv_*.a 文件**
5、修改pro文件
在下图所示位置增添pri文件路径即可
# Include the OpenCV configuration
include("D:\Program Files\opencv\opencv_Qt_msvc.prj")
6、测试
与vs测试的cpp代码相同,将main.cpp中的代码替换掉,点击运行
成功!!!
常见问题!!!
1、ImportError: DLL load failed while importing cv2: 动态链接库(DLL)初始化例程失败。
此种情况为可以正常加载dll动态库但是运行初始化失败。
有以下几种可能:
1、编译器版本不匹配
cmake 使用的python或其他编译器 编译版本和运行版本不匹配,比如使用的是python 3.12编译,却使用3.9运行。
2、vc_runtime 版本过旧
vc_runtime 过旧,如果如果使用的是系统环境下的python,或者使用的VS、Qt
请下载该文件后,
Microsoft Visual C++ 可再发行程序包最新支持的下载 安装,即使已经显示安装,请务必点击修复,重新安装一次。(踩过这个坑)
2、“ImportError:导入 cv2 时 DLL 加载失败:找不到指定的模块。”
参考:https://www.jamesbowley.co.uk/nbs/ImportError_dll_load_failed_while_importing_cv2.html
此情况为某些动态链接库(dll文件)在加载中没有找到。
该问题有很多blog,但是大部分都是在推荐使用Dependencies或者**dependency walker,**在此我也提供下载链接。这两个依赖分析软件都使用过,但不是很直观,对于这种复杂的依赖关系,排查起来很困难。
这里推荐使用 Process Monitor,这是一种适用于 Windows 的进程监视工具。此工具使我们能够查看 Python 尝试加载的 DLL 的名称以及它在运行时搜索的位置。
默认情况下,Process Monitor 会产生大量输出,因此最好尽可能多地过滤掉这些无用信息:
1、手动添加筛选器条目
由于我们只想查看 python.exe 进程访问的共享库,因此我们可以添加以下过滤器来简化我们的任务:
- Process Name -> is -> python.exe
- Operation -> is -> CreateFile
- Result -> is -> NAME NOT FOUND
- Result -> is -> SUCCESS
- Path -> contains -> .dll
- Path -> contains -> .pyd 不是必要的,如果缺少,错误将是“ModuleNotFoundError:没有名为’cv2’的模块”,但为了完整起见,我们将包含它)
2、使用进程监视器查找遗漏的 DLL
在继续之前,建议关闭任何其他 Python 进程,因为这些进程的输出会影响进程监视器的主窗口。
现在,请按照下列步骤操作:
-
启动 Python。
-
按进程监视器中的清除按钮(橡皮图标)以清除 Python 初始化期间生成的任何输出。
-
导入 OpenCV (
import cv2
)
为了演示它是如何工作的,我重新启动了Python,然后再次运行,如下图所示:
import cv2
3、自动搜索进程监视器日志以查找缺少的 DLL
Process Monitor 的输出可能难以筛选哪些dll是真的没有加载成功的。为了帮助解决这个问题,我们可以将输出导出到 .csv 文件,然后使用下面的python文件对其进行解析。
导出日志:
- 转到文件 -> 保存
2. 选择格式 ->逗号分隔值 (CSV)
- 在“路径”下输入导出文件的所需位置
- 点击保存
下面是一个 Python 代码,该程序将解析导出的 CSV 并打印缺少的 DLL 的名称:
import csv
from pathlib import Path
import re
def print_missing_libs(process_mon_export_file_path):
shared_libs = {}
with open(process_mon_export_file_path, mode='r', encoding='utf-8') as file:
csv_reader = csv.reader(file, delimiter=',')
for row in csv_reader:
key = Path(row[4]).name.lower()
val = row[5]
if key not in shared_libs or key in shared_libs and shared_libs[key] != 'SUCCESS':
shared_libs[key] = val
pattern = re.compile(r"__init__")
for entry, status in shared_libs.items():
if status == 'NAME NOT FOUND' and not re.search(pattern, entry):
print(entry)
def main():
process_mon_export_file_path = "Logfile.CSV"
print_missing_libs(process_mon_export_file_path)
if __name__ == '__main__':
main()
将该路径改为自己保存csv的路径,运行该代码即可输出没有加载的dll文件。
process_mon_export_file_path = "Logfile.CSV"
根据输出的dll文件,判断环境变量是否添加正确,有哪些dll文件缺少,进行查漏补缺。
本文是近一周的opencv 编译与验证 踩坑总结,感谢浏览,如果真的帮到了你,能否留下个赞鼓励一下
作者:Bethxone