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\cv2config.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"
}

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 进程访问的共享库,因此我们可以添加以下过滤器来简化我们的任务:
在这里插入图片描述

  1. Process Name -> is -> python.exe
  2. Operation -> is -> CreateFile
  3. Result -> is -> NAME NOT FOUND
  4. Result -> is -> SUCCESS
  5. Path -> contains -> .dll
  6. Path -> contains -> .pyd 不是必要的,如果缺少,错误将是“ModuleNotFoundError:没有名为’cv2’的模块”,但为了完整起见,我们将包含它)
    在这里插入图片描述

2、使用进程监视器查找遗漏的 DLL

在继续之前,建议关闭任何其他 Python 进程,因为这些进程的输出会影响进程监视器的主窗口。

现在,请按照下列步骤操作:

  1. 启动 Python。

  2. 按进程监视器中的清除按钮(橡皮图标)以清除 Python 初始化期间生成的任何输出。
    在这里插入图片描述

  3. 导入 OpenCV (import cv2)

为了演示它是如何工作的,我重新启动了Python,然后再次运行,如下图所示:

在这里插入图片描述

import cv2

3、自动搜索进程监视器日志以查找缺少的 DLL

Process Monitor 的输出可能难以筛选哪些dll是真的没有加载成功的。为了帮助解决这个问题,我们可以将输出导出到 .csv 文件,然后使用下面的python文件对其进行解析。

导出日志:

  1. 转到文件 -> 保存

在这里插入图片描述
2. 选择格式 ->逗号分隔值 (CSV)

在这里插入图片描述

  1. 在“路径”下输入导出文件的所需位置
  2. 点击保存

下面是一个 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 编译与验证 踩坑总结,感谢浏览,如果真的帮到了你,能否留下个赞鼓励一下

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值