【youcans 的 OpenCV 学习课】1.2 编译生成带有 OpenCV_contrib 的 OpenCV 库

news2024/11/25 20:42:22

专栏地址:『youcans 的图像处理学习课』
文章目录:『youcans 的图像处理学习课 - 总目录』


【youcans 的 OpenCV 学习课】1.2 编译生成 OpenCV_contrib 的 OpenCV 库


文章目录

  • 【youcans 的 OpenCV 学习课】1.2 编译生成 OpenCV_contrib 的 OpenCV 库
    • 1. 工具下载与安装
      • 1.1 下载和安装 Visual Studio
      • 1.2 下载和安装 CMake
    • 2. 下载和编译 OpenCV 源码
      • 2.1 下载 OpenCV 源码
      • 2.2 下载 OpenCV_contrib 源码
      • 2.3 解压下载的源码压缩文件
    • 3. 用 CMake 编译 OpenCV 源码
      • 3.1 CMake 项目设置
      • 3.2 CMake 项目构建
      • 3.3 向项目添加 OpenCV_contrib
      • 3.4 生成 opencv.sln 文件
    • 4. 用 Visual Studio 生成带有 OpenCV_contrib 接口的 OpenCV 库
      • 4.1 打开解决方案文件
      • 4.2 生成 Debug 方案
      • 4.3 生成 Release 版本
      • 4.4 使用 cv2.pyd 文件
    • 5. 使用带有 OpenCV_contrib 接口的 OpenCV 库
      • 5.1 测试带有 OpenCV_contrib 接口的 OpenCV 库
      • 5.2 使用 OpenCV_contrib 库的函数

官方的 OpenCV-Python 库缺少一些涉及专利的或测试的算法(例如 SURF、Multitracking),需要自己下载源码,编译生成 带有 OpenCV_contrib 接口的 OpenCV 库。

本文详细讲解使用 CMake 与 Visual Studio,编译生成 带有 OpenCV_contrib 接口的 OpenCV 库。这个过程非常麻烦,容易遇到各种问题。作者从网上搜了很多文章,很多语焉不详,或者缺失关键步骤(也许只是一个细节),多次尝试多次失败,多次失败至于成功。


1. 工具下载与安装

首先需要安装与配置 CMake 与 Visual Studio,已经装过的可以跳过。

1.1 下载和安装 Visual Studio

推荐“以管理员身份运行”打开安装程序。

Visual Studio 安装后占用空间很大(8~10G),推荐修改安装目录/下载缓存目录,建议不要安装在 C 盘。

注意安装 Visual Studio 时添加 C++桌面开发 和 Python开发。

安装 Visual Studio 的详细步骤,本文不做详细介绍,可以参考:Visual Studio安装教程。

在这里插入图片描述


在这里插入图片描述


1.2 下载和安装 CMake

根据系统配置,在 CMake官网 下载安装包,例如:cmake-3.24.1-windows-x86_64.msi。CMake 官网地址:https://cmake.org/

在这里插入图片描述


安装 CMake,安装过程比较简,可以参考:Windows下Cmake安装步骤详解(图文)。

注意安装时将 CMake 添加到用户变量。

安装完成后可以进入 cmd 查看版本:cmake /V

在这里插入图片描述


2. 下载和编译 OpenCV 源码

2.1 下载 OpenCV 源码

OpenCV 源码可以从 OpenCV 官网或 Github 下载,也可以从 Gitee 码云 国内下载。目前的最新版本是 OpenCV 4.6.0。

注意官网下载时,要下载源码或源码的压缩文件,而不是类似 opencv_contrib_python-4.4.0.46-cp38-cp38-win_amd64.whl 的编译文件的压缩包。

  • Github 下载地址:
    OpenCV 源码(https://github.com/opencv/opencv/releases)

    在这里插入图片描述


  • Gitee 码云 国内下载地址:
    OpenCV_contrib 码云库(https://gitee.com/opencv-lhd/opencv_contrib)

2.2 下载 OpenCV_contrib 源码

OpenCV_contrib 源码可以从 Github 下载,也可以从 Gitee 码云 国内下载。

注意要下载与 OpenCV 源码相同版本的 OpenCV_contrib,例如都选择 4.6.0 版本。

  • Github 下载地址:

    OpenCV_contrib 源码(https://github.com/opencv/opencv_contrib/releases)

    在这里插入图片描述

  • Gitee 码云 国内下载:
    OpenCV_contrib 码云库(https://gitee.com/opencv-lhd/opencv_contrib)

2.3 解压下载的源码压缩文件

  • 例如:OpenCV 4.6.0 源码解压到指定的文件夹 D:\CV2\Opencv-4.6.0,OpenCV_contrib 4.6.0 源码解压到文件夹 D:\CV2\Opencv_contrib-4.6.0。

  • 注意:新建子目录 build 作为 CMake output 路径,用于存放编译的中间文件和输出文件。

在这里插入图片描述


3. 用 CMake 编译 OpenCV 源码

3.1 CMake 项目设置

参考下图进行设置:

  • Where is the source code 选项:设为 OpenCV 4.6.0 源码解压的文件夹。
  • Where to build the binaries 选项:设为建立的子目录 build,即 CMake output 路径。
  • 点击 Configure 按键弹出菜单,选择安装的 Visual Studio 版本,并选择处理器类型(默认x64),点击 finish 完成 Configure 设置。

在这里插入图片描述

开始配置构建项目,等待。。。


3.2 CMake 项目构建

构建过程中有提示,其中可能会有红色报错,通常是由于文件下载失败。

如果最后能出现图中的 Configuring done,说明构建通过。

在这里插入图片描述


对于红色报错信息,可以忽略,也可以再次点击 Configuring 按钮重新配置。还可以手动处理,详见:用Cmake 编译OpenCV常见的错误。

中间区域的选项可以根据需要进行选择,例如:

  • WITH 区域: 选择需要的额外功能,例如是否支持GUDA等
  • BUILD区域:可以配置构建项目,如果编译失败,查看是哪个项目,可以取消该项目的勾选后再次重新编译

3.3 向项目添加 OpenCV_contrib

  • 修改 CMake 界面中部的 Name-Value 选项设置:
    • 找到如图 OPENCV_ENABLE_NONFREE,勾选 Value 栏中的选项框。
    • 找到如图 OPENCV_EXTRA_MODULES_PATH,在 Value 栏中添加解压的 Opencv_contrib 文件路径 ,推荐设置到 modules 文件夹。

在这里插入图片描述


  • 再次点击 Configure按键,加载 xfeatures2d 等 contrib 功能模块,完成后再次出现图中的 Configuring done,说明构建完成。

3.4 生成 opencv.sln 文件

  • 点击 Generate按键进行编译,完成后出现图中的 Generating done,说明 OpenCV 库编译完成。
  • 生成的解决方案文件 opencv.sln 文件在CMake output 路径 D:\CV2\build 中。

在这里插入图片描述


4. 用 Visual Studio 生成带有 OpenCV_contrib 接口的 OpenCV 库

4.1 打开解决方案文件

在 CMake 中点击 Open Project 按键打开项目,也可以直接用 Visual Studio 打开建立的 opencv.sln 文件。

Visual Studio 加载解决方案项目…等待


4.2 生成 Debug 方案

  • 在 Visual Studio 选择 Debug 模式,x64,菜单选择生成->生成解决方案,进行编译。

漫长等待,“输出”状态栏将显示正在执行的操作,等待…

终于完成,输出显示:“生成: 成功 172 个,失败 2 个,最新 0 个,跳过 10 个”,实际执行的成功/失败个数可能不同。

在这里插入图片描述


  • 从 Visual Studio 右侧“解决方案资源管理器” 选择 “CMakeTargets-INSTALL”,点击唤出右键菜单,选择 “仅用于项目-仅生成 INSTALL”,进行打包。

“输出”状态栏将显示正在执行的操作,等待…

完成后输出显示:“生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个”。


4.3 生成 Release 版本

  • 在 Visual Studio 将 Debug 模式 修改为 Release 模式,更新项目配置。
  • 此时可以选择 清理解决方案(非必须)。

完成后输出显示:“清理: 成功 174 个,失败 0 个,跳过 10 个”。

  • 在 Release 模式下,选择生成->生成解决方案,进行编译。

更加漫长的等待,“输出”状态栏将显示正在执行的操作…

在这里插入图片描述

终于完成,输出显示:“成功 169 个,失败 0 个,最新 0 个,跳过 10 个”。

如果报错失败,如果不是核心模块,建议先根据报错提示信息,从右侧的“解决方案资源管理器” 选择报错的模块,右键选择“移除”,再重新执行“生成解决方案”。

  • 从 Visual Studio 右侧“解决方案资源管理器” 选择 “CMakeTargets-INSTALL”,点击唤出右键菜单,选择 “仅用于项目-仅生成 INSTALL”,进行打包。

完成后输出显示:“生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个”。


4.4 使用 cv2.pyd 文件

以上 Visual Studio 编译生成 OpenCV-Python接口,在 CMake output 路径下的 lib\python3\Release 目录中生成了带有 OpenCV_contrib 接口的 OpenCV库文件,例如:cv2.pyd 或 cv2.cp36-win32.pyd。

将生成的 cv2.pyd 或 cv2.cp36-win32.pyd 复制到相应的 python 安装目录的 lib/site-packet/cv2 下即可使用。根据环境设置的不同,cv2.pyd 也可能已经自动部署。

在这里插入图片描述

顺便说一下,如果检查 D:\CV2,所占空间高达 24.1GB。不过,除了保存 pyd 文件的 lib 目录,其它目录都可以删除。


5. 使用带有 OpenCV_contrib 接口的 OpenCV 库

5.1 测试带有 OpenCV_contrib 接口的 OpenCV 库

在 python 的交互界面中输入 import cv2,如果没有报错就说明编译的 python 接口成功。


5.2 使用 OpenCV_contrib 库的函数

在 OpenCV 中 ximgproc 模块中提供了 cv::xfeatures2d::SURF 类实现 SURF 特征检测算法。

SURF 是专利算法,OpenCV3、OpenCV4 将其移入了 OpenCV_contrib 扩展模块中,使用 SURF 需要 opencv-contrib-python 包的支持。在 OpenCV/Python 的一些版本中对编译进行了限制,使用 SURF 算法时会出现错误,需要自行编译并选择 OPENCV_ENABLE_NONFREE选项。

本例程示例加速鲁棒特征变换(SURF算法)的使用。通过本例程可以检查带有 OpenCV_contrib 接口的 OpenCV 库是否正确使用。

"""
200 OpenCV examples by youcans / OpenCV 例程 200 篇
Copyright: 2022, Shan Huang, youcans@qq.com
"""

# 【1704】特征检测之加速鲁棒特征变换(SURF算法)
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    img = cv.imread("../images/Fig1701.png", flags=1)
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # (500, 500)
    print("shape of image: ", gray.shape)

    # SURF 关键点检测和特征描述
    surf = cv.xfeatures2d.SURF_create()  # 实例化 SURF 对象
    # kp, descriptors = surf.detectAndCompute(gray)  # 检测关键点和生成描述符
    kpSurf = surf.detect(gray)  # 关键点检测
    kpSurf, desSurf = surf.compute(gray, kpSurf)  # 生成描述符
    print("Num of keypoints: ", len(kpSurf))  # 695
    imgS = cv.convertScaleAbs(img, alpha=0.25, beta=192)
    imgSurf1 = cv.drawKeypoints(imgS, kpSurf, None)  # 只绘制关键点位置
    imgSurf2 = cv.drawKeypoints(imgS, kpSurf, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)  # 绘制关键点大小和方向

    plt.figure(figsize=(9, 3.4))
    plt.subplot(131), plt.title("1. Original")
    plt.axis('off'), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.subplot(132), plt.title("2. SURF keypoints")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgSurf1, cv.COLOR_BGR2RGB))
    plt.subplot(133), plt.title("3. SURF keypoint scaled")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgSurf2, cv.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

运行结果:

程序运行结果如图17-5所示。子图1是原始图像,子图2、子图3将SURF检测的关键点绘制在原始图像上。子图2只绘制了关键点的中心,子图3对每个关键点绘制表示关键点大小和方向的圆圈。

在这里插入图片描述


【本节完】


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/127148909)
Copyright 2022 youcans, XUPT
Crated:2022-12-26

参考文献
OpenCV install opencv_contrib on Windows

欢迎关注 『youcans 的 OpenCV 学习课』 系列,持续更新
文章目录:『youcans 的图像处理学习课 - 总目录』

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习笔记之Sigmoid信念网络(一)对数似然梯度

机器学习笔记之Sigmoid信念网络——对数似然梯度引言回顾:贝叶斯网络的因子分解Sigmoid信念网络对数似然梯度推导过程梯度求解过程中的问题引言 从本节开始,将介绍Sigmoid\text{Sigmoid}Sigmoid信念网络。 回顾:贝叶斯网络的因子分解 Sigmo…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件

本文简述如何在Smobiler中使用Bluetooth。 Step 1. 新建一个SmobilerForm窗体&#xff0c;并在窗体中加入Button和Bluetooth&#xff0c;布局如下 Button的点击事件代码&#xff1a; /// <summary>/// 关闭蓝牙/// </summary>/// <param name"sender"…

飞项三招教你用协同工具杜绝远程办公“摸鱼”

共同社19日报道称&#xff0c;总务省在新冠紧急事态宣言全面解除后不久的2021年10月对日本约9万户家庭开展了社会生活基本调查&#xff0c;利用获得的数据&#xff0c;对上班族中在调查当天有过远程办公的人和完全没有远程办公的人的工作日时间分配进行了比较。 结果显示&…

【vue面试题】

vue谈谈你怼MVVM开发模式的理解vue优点渐进式框架的理解vue常用的指令v-if和v-showv-if和v-for的优先级如何让CSS只在当前组件中起作用?<keep-alive></keep-alive> 的作用是什么?如何获取dom?vue-loader是什么&#xff1f;使用它的用途有哪些&#xff1f;assets…

哺乳时宝宝一边吃奶,另一边却自动流出来,这是怎么回事?

别人眼中的母乳喂养只是简单地把宝宝抱在怀里&#xff0c;让宝宝吃饱&#xff0c;超级简单。事实上&#xff0c;有很多母乳喂养。“麻烦事”比如母乳不足、堵奶、乳腺炎等&#xff0c;甚至更多“简单”漏奶会让宝宝头疼。有些妈妈很幸运&#xff0c;不知道什么是漏奶&#xff0…

小程序之会议管理

会议管理 注意事项 一些需要注意的细节&#xff1a; 因为 WXML 节点标签名只能是小写字母、中划线和下划线的组合&#xff0c;所以自定义组件的标签名也只能包含这些字符。自定义组件也是可以引用自定义组件的&#xff0c;引用方法类似于页面引用自定义组件的方式&#xff0…

React DAY07

复习&#xff1a; 1.RN中的样式和布局 RN样式完全脱离浏览器&#xff0c;自成体系的一套样式&#xff0c;使用对象创建样式 行内样式&#xff1a; <Text style{{color: red}}>内部样式&#xff1a; let ss StyleSheet.create({danger: {color: red}}) <Text styl…

从业多年的Android开发,竟拿不到 Application Context?

Android 开发者们对于 Application 并不陌生。有的时候为避免内存泄漏&#xff0c;常常不直接使用 Context 而是通过其提供的 getApplicationContext() 确保拿到的是 Application 级别的 Context。而本次像通常一样&#xff0c;拿到的 Application 却是 null&#xff0c;到底是…

国考省考行测:细节理解,对错判断,要素查找,问什么,找什么,对比分析

国考省考行测&#xff1a;细节理解&#xff0c;对错判断&#xff0c;要素查找&#xff0c;问什么&#xff0c;找什么&#xff0c;对比分析 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要…

头戴式耳机适合运动吗、五款最适合运动的耳机分享

戴着耳机锻炼&#xff0c;听着动感的音乐&#xff0c;会让你心潮澎湃&#xff0c;瞬间感觉自己力大无穷。那什么样的耳机更适合在健身房锻炼时戴呢&#xff1f;首先稳固性和舒适度一定要比较好&#xff0c;毕竟在运动的过程中老是感觉到不适或者掉落&#xff0c;那真的是很令人…

旋转的扰动、导数和积分

The plus operator 设M\mathcal{M}M表示一个n维的流型&#xff0c;因为流型局部同胚与Rn\mathbb{R}^nRn&#xff0c;所以我们可以通过定义符号⊞\boxplus⊞和⊟\boxminus⊟建立一个流型M\mathcal{M}M的局部邻域和其正切空间的双射。 ⊞:MRn→M;⊟:MMn→Rn\boxplus:\mathcal{M}…

为什么说用了MES系统,但生产数字化管理只做到20%?

随着越来越多的制造企业开始体验和建设MES系统&#xff0c;MES系统能够实现生产执行过程的有效数字化管理已经成为共识。回过头来看&#xff0c;是不是只有生产进度才是工厂需要管理的&#xff1f;当你想详细了解当前存在的问题&#xff0c;进展如何&#xff0c;哪些月度重点任…

JAVA零基础小白学习教程之day09-内部类权限final静态

day09-JAVAOOP 课程目标 1. 【理解】什么是内部类 2. 【掌握】匿名内部类 3. 【掌握】引用数据类型作为方法的参数 4. 【理解】final关键字的使用 5. 【理解】包的定义及使用 6. 【理解】权限修饰符 7. 【掌握】static关键字的使用B友https://www.bilibili.com/video/BV1QG4y…

职场员工有没有潜力,看这一个能力就够了

在我组织的研讨会上&#xff0c;讲故事的课程通常以一个思考练习开始。 我会让参与者闭上眼睛回忆《小红帽》的故事&#xff0c;尤其考虑其中的情节、起伏和结尾。这个练习有时会引发一阵笑声&#xff0c;人们会好奇这与课程有什么相关性&#xff0c;或者干脆把《小红帽》与《…

给Debezium connector 发送信号

1. 概述 Debezium 信号机制提供了一种方法来修改连接器的行为&#xff0c;或触发一次性操作&#xff0c;例如启动表的 临时快照。要触发连接器执行指定操作&#xff0c;可以发出特殊的SQL 命令以将信号消息添加到专门的信号表&#xff0c;也称为信号数据集合。在源数据库上创建…

哪些进销存软件既好用又免费?

中小企业刚起步都会面临着资金紧缺、人力资源不足等诸多管理问题&#xff0c;对于大部分预算不是很多的中小企业或者尚未尝试过进销存软件的企业&#xff0c;都会选择免费进销存软件来进行企业管理或体验进销存软件的功效。 进销存软件的开发需要强大的技术支持&#xff0c;数…

B站技术选型与架构

目录前言B站前端之路B站Golang技术栈分析bilibili技术总监毛剑简介前言 了解了一下B站的技术发展历程&#xff1a;最开始是用PHP语言开发的&#xff0c;后来B站的中台逐步被Node占领&#xff0c;而后台技术为了更高的并发、更稳健&#xff0c;以及为了大数据分析&#xff0c;逐…

RK3568平台开发系列讲解(Linux系统篇)共享内存

🚀返回专栏总目录 文章目录 一、共享内存底层实现二、共享内存API三、共享内存案例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢共享内存技术是功能最强、应用最广的进程间通信技术。其原理是多个进程共享相同的物理内存区,一个进程对该内存区的任意修改,可被其…

不懂Nacos没关系,可以看看它是怎么运用代理模式的

背景 看Nacos的源代码时&#xff0c;发现其中有对代理模式的运用&#xff0c;而且用得还不错&#xff0c;可以作为一个典型案例来聊聊&#xff0c;方便大家以更真实的案例来体验一下代理模式的运用。如果你对Nacos不了解&#xff0c;也并不影响对本篇文章的阅读和学习。 本文…

前端三小时用html和js写一个贪吃蛇游戏,非常简单带讲解,代码可直接用,功能完整

目录 游戏主体部分--地狱模式 游戏主页入口 预览图 游戏入口代码 1.html 2.css 3.js 注册页面代码 游戏实现很简单&#xff0c;只写游戏主体的话只要三小时就够了。 话不多说&#xff0c;我们直接来看效果预览。 转成gif图之后有点卡&#xff0c;但是游戏效果并不卡&…