【配置环境】Visual Studio 配置 OpenCV

目录

一,环境

二,下载和配置 OpenCV

三,创建一个 Visual Studio 项目

四,配置 Visual Studio 项目

五,编写并编译 OpenCV 程序

六,解决CMake编译OpenCV报的错误

七,本人编译好的库


一,环境

  • Windows 11 家庭中文版
  • Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.5.3
  • CMake – 3.24.1
  • OpenCV – 4.8.0

二,下载和配置 OpenCV

1.在Windows下安装OpenCV,通常有两种选择

  1. 使用预编译的二进制库(推荐): 这是最常见的方法。可以从OpenCV官方网站下载已经编译好的二进制版本,无需自己编译。这些预编译库已经包含了OpenCV的头文件和库文件,可以直接在项目中使用。
    1. 前往 OpenCV Releases 页面 下载最新的版本(选择Windows版)。
    2. 解压下载的文件到指定路径下,会得到一个文件夹,例如opencv/build,内容参考如下。
  2. 从源代码编译OpenCV(高级选项): 如果需要进行高级配置、自定义编译选项或者希望在Windows上编译OpenCV的源代码,可以选择这种方法。但这通常较为复杂,需要更多时间和资源。
    1. 首先,从OpenCV的 GitHub仓库 下载源代码。
    2. 安装CMake,可以从 CMake官网 下载并安装最新的CMake版本,这是一个用于配置和生成编译项目的工具。
    3. 打开CMake GUI,在 “Where is the source code” 中选择OpenCV的源代码目录。在 “Where to build the binaries” 中选择一个用于生成编译结果的目标文件夹,通常建议在源代码目录之外创建一个名为 “build” 的文件夹。
    4. 点击 “Configure” 按钮。CMake将提示选择生成器,选择合适的Visual Studio版本(例如,Visual Studio 2022),选择需要生成的位数(默认为64位)。
    5. CMake编译过程中可能会报一些红色的错误的提示信息,解决办法看最后一节。(可以跳过这些错误
    6. 配置选项:在CMake配置过程中,可以根据需要设置不同的选项,如编译类型、安装路径、开启/关闭模块等。确保根据自己的需求进行配置。(网上搜索
    7. 点击 “Generate” 按钮,这将生成一个Visual Studio项目文件。
    8. 打开生成的Visual Studio项目文件(通常是.sln文件),或者点击CMake界面的“Open Project”。
    9. 在Visual Studio中,选择 “Release” 或 “Debug” 配置(根据需要选择),然后找到 “CMakeTargets > INSTALL” 文件,右击该文件选择 “生成” 选项。这将编译OpenCV。

    10. 编译完成后,可以在生成的目标文件夹中找到编译好的OpenCV库文件(通常在 build/install 文件夹下)。
    11. 按照上面方式可以自行构建Release/Debug,64/32位的库。

2.配置 OpenCV 环境变量

  1. 使用键盘快捷键 Win + R 打开运行对话框。在运行对话框中,输入 sysdm.cpl,然后按 Enter 键。这将直接打开系统属性窗口的 “高级” 选项卡,从那里访问环境变量配置。
  2. 添加OpenCV的 bin 文件夹路径,以便系统可以找到OpenCV的DLL文件。例如:D:Program FilesOpenCVbuildx64vc16bin(请根据你的实际路径进行替换)。
  3. 添加OpenCV的 lib 文件夹路径,以便编译器和连接器可以找到OpenCV的库文件。例如:D:Program FilesOpenCVbuildx64vc16lib(请根据你的实际路径进行替换)。
  4. 确保点击了 "确定" 按钮,然后关闭所有窗口。
  5. 打开命令提示符,输入 opencv_version 命令,检查OpenCV是否配置成功。如果配置成功,会输出OpenCV的版本号,表明OpenCV库可在命令行中正常运行。

三,创建一个 Visual Studio 项目

使用Visual Studio创建一个新的C++项目,或者打开一个现有的项目。

四,配置 Visual Studio 项目

1.跟随项目进行配置(推荐)

  1. 打开项目属性,选择 “配置属性 > VC++ 目录”,然后将 “包含目录” 配置为包含OpenCV的include文件夹(opencvbuildinclude),将 “库目录” 配置为包含OpenCV的lib文件夹(opencvbuildx64vc16lib)。
  2. 在 “配置属性 > 链接器 > 输入” 下,将 “附加依赖项” 添加要使用的 OpenCV 库文件(例如 opencv_world480d.lib)。

2.全局配置(不推荐)

  1. 点击工具栏的 “视图” 视图项。展开后点击 “其它窗口 > 属性管理器”。
  2. 然后会得到四种不同的模式,在每种模式目录下会默认有几个系统文件,这里对 “xxx.64.user” 系统文件按照前面提到的方式配置当前项目以使用这些编译库,在这些系统文件中进行的属性配置是全局配置。

  3. 也可以新添一个属性文件,然后也按照前面提到的方式配置当前项目以使用这些编译库,该属性文件是保存在当前项目目录下的(这种配置是跟随项目的,可以对四种模式都新添一个属性文件)。

五,编写并编译 OpenCV 程序

以下是一些基本图像处理程序

1.加载和显示图像:创建一个程序,能够加载图像文件并将其显示在窗口中。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 显示图像
    cv::imshow("My Image", image);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

2.调整图像大小:编写代码,可以加载图像并调整其大小。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 调整图像大小
    cv::Size newSize(800, 600);
    cv::Mat resizedImage;
    cv::resize(image, resizedImage, newSize);

    // 显示调整后的图像
    cv::imshow("Resized Image", resizedImage);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

3.应用滤波器:学习如何应用常见的图像滤波器,例如高斯滤波器。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 应用高斯滤波
    cv::Mat blurredImage;
    cv::GaussianBlur(image, blurredImage, cv::Size(5, 5), 0);

    // 显示模糊图像
    cv::imshow("Blurred Image", blurredImage);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

4.检测边缘:创建一个程序,用于检测图像中的边缘。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 检测边缘
    cv::Mat edges;
    cv::Canny(image, edges, 100, 200);

    // 显示边缘图像
    cv::imshow("Edge Image", edges);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

5.图像转换:练习图像颜色空间的转换,如将彩色图像转换为灰度图像,并将图像从RGB颜色空间转换为HSV颜色空间。

#include <iostream>
#include <opencv2/opencv.hpp>

//#pragma comment(lib,"opencv_world480d.lib")

int main() {
    // 加载图像
    cv::Mat image = cv::imread("your_image.jpg");
    if (image.empty()) {
        std::cerr << "Error: Could not read image file." << std::endl;
        return -1;
    }

    // 转换为灰度图像
    cv::Mat grayImage;
    cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);

    // 显示灰度图像
    cv::imshow("Gray Image", grayImage);
    cv::waitKey(0);
    cv::destroyAllWindows();

    // 转换为HSV颜色空间
    cv::Mat hsvImage;
    cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);

    // 分离通道
    std::vector<cv::Mat> channels;
    cv::split(hsvImage, channels);

    // 显示H、S、V通道
    cv::imshow("Hue Channel", channels[0]); // H通道
    cv::imshow("Saturation Channel", channels[1]); // S通道
    cv::imshow("Value Channel", channels[2]); // V通道
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

6.要深入理解OpenCV,官网也提供了丰富的示例代码,如下。

六,解决CMake编译OpenCV报的错误

1.定位问题

  • 以下错误表示检测到了Python解释器的版本与期望的版本不符,但这个错误可以忽略,不用管
  • 但后面会出现很多如下这种错误,就是不能从指定的链接中下载需要的文件资源,详细情况可以看 build/CMakeDownloadLog.txt 文件。
  • CMakeDownloadLog.txt 文件用途:
    • CMakeDownloadLog.txt 文件是由CMake工具生成的日志文件,主要用于记录CMake在下载依赖项和外部资源时的详细信息。
    • CMakeDownloadLog.txt 文件对于排查和调试依赖项下载问题非常有用。当在使用CMake配置或构建项目时,如果下载依赖项失败或遇到与外部资源相关的问题,可以查看这个文件以获取更多信息,以便进一步解决问题。
  • 打开 CMakeDownloadLog.txt 文件后,会显示如下信息,其中的每一段都是我们要解决的错误:

2.分析问题

  • 先分析这些错误信息是什么意思,然后我们就很容易的去解决问题了,摘取其中一段显示如下(其它都是类似的问题)
  • 其中红框的内容解释如下:
    • #do_copy:这是一个命令,表示从指定的URL下载名为 "ffmpeg_version.cmake" 的文件,并将其复制到本地目录 "D:/opencv/build/3rdparty/ffmpeg"。并且该文件的MD5哈希值文设置为 "8862c87496e2e8c375965e1277dee1c7"。
    • #missing:这是一条信息,表示在指定的本地目录中没有找到名为 "ffmpeg_version.cmake" 的文件。
    • #check_md5:这是一条信息,表示检查名为 "ffmpeg_version.cmake" 文件的MD5哈希值,以验证文件完整性。
    • #mismatch_md5:这是一条信息,表示本地文件的MD5哈希值与预期值 "d41d8cd98f00b204e9800998ecf8427e" 不匹配,说明文件可能已损坏或缺失。
    • #delete:这是一条命令,表示删除本地缓存目录中的文件。
    • #cmake_download:这是一条命令,表示尝试从指定的URL重新下载文件。
    • #try 1:这是一条信息,表示这是第一次尝试下载文件。
    • 总的来说:do_copy 尝试从指定的URL下载名为 "ffmpeg_version.cmake" 的文件,并保存到本地目录 "D:/opencv/build/3rdparty/ffmpeg"。首先,它检查本地目录中是否已经存在文件 "ffmpeg_version.cmake",但没有找到该文件(missing)。然后,它尝试根据文件的MD5哈希值检查本地缓存目录中是否有与下载文件匹配的文件,但发现MD5哈希值不匹配(mismatch_md5)。接下来,它尝试从指定的URL下载文件,并在第一次尝试时遇到了网络问题。
  • 具体的错误信息:
    • # timeout on name lookup is not supported这个错误消息表示在进行DNS名称解析时发生了超时错误。CMake试图解析主机名 "raw.githubusercontent.com",但因为解析超时,所以无法连接到该主机。
    • # getaddrinfo(3) failed for raw.githubusercontent.com:443这个错误消息表明获取主机地址信息失败,其中 "raw.githubusercontent.com:443" 是要解析的主机名和端口。
    • # Could not resolve host: raw.githubusercontent.com这个错误消息指出无法解析主机名 "raw.githubusercontent.com"。
    • # Closing connection 0这是一条信息,表示关闭了与主机的连接。
    • 总结:这些错误的主要原因是CMake无法通过DNS解析找到主机名 "raw.githubusercontent.com",因此无法连接到GitHub服务器以下载所需的文件 "ffmpeg_version.cmake"。

3.解决问题

  • 确定了问题原因是无法下载 ffmpeg_version.cmake 文件,浏览器输入指定的URL后,显示如下信息:
  • 接下来就是要下载 ffmpeg_version.cmake 文件,然后覆盖D:/opencv/source/.cache/ffmpeg/8862c87496e2e8c375965e1277dee1c7-ffmpeg_version.cmake 文件,再进行编译就行了。

七,本人编译好的库

百度网盘链接:VS2022编译的OpenCV库,四种模式下都可以使用(Release32,Release64,Debug32,Debug64)。