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

时间:2022-12-27 08:04:05

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


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


官方的 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安装教程

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


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


1.2 下载和安装 CMake

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

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


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

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

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

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


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)

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


  • 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)

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

  • 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 路径,用于存放编译的中间文件和输出文件。

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


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 设置。

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

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


3.2 CMake 项目构建

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

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

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


对于红色报错信息,可以忽略,也可以再次点击 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 文件夹。

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


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

3.4 生成 opencv.sln 文件

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

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


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 个”,实际执行的成功/失败个数可能不同。

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


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

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

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


4.3 生成 Release 版本

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

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

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

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

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

终于完成,输出显示:“成功 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 也可能已经自动部署。

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

顺便说一下,如果检查 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 的 OpenCV 学习课】1.2 编译生成带有 OpenCV_contrib 的 OpenCV 库


【本节完】


版权声明:
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 的图像处理学习课 - 总目录』