目录
[二,下载和配置 OpenCV](#二,下载和配置 OpenCV)
[三,创建一个 Visual Studio 项目](#三,创建一个 Visual Studio 项目)
[四,配置 Visual Studio 项目](#四,配置 Visual Studio 项目)
[五,编写并编译 OpenCV 程序](#五,编写并编译 OpenCV 程序)
一,环境
- Windows 11 家庭中文版
- Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.5.3
- OpenCV -- 4.8.0
二,下载和配置 OpenCV
1.在Windows下安装OpenCV,你通常有两种选择
- 使用预编译的二进制库(推荐): 这是最常见的方法。可以从OpenCV官方网站下载已经编译好的二进制版本,无需自己编译。这些预编译库已经包含了OpenCV的头文件和库文件,可以直接在项目中使用。
- 前往 OpenCV Releases 页面 下载最新的版本(选择Windows版)。
- 解压下载的文件到指定路径下,会得到一个文件夹,例如
opencv/build,
内容参考如下。然后按照前面提到的方式配置你的项目以使用这些预编译库。- 从源代码编译OpenCV(高级选项): 如果你需要进行高级配置、自定义编译选项或者希望在Windows上编译OpenCV的源代码,你可以选择这种方法。但这通常较为复杂,需要更多时间和资源。
- 首先,从OpenCV的 GitHub仓库 下载源代码。
- 安装CMake,可以从 CMake官网 下载并安装最新的CMake版本,这是一个用于配置和生成编译项目的工具。
- 打开CMake GUI,在 "Where is the source code" 中选择OpenCV的源代码目录。在 "Where to build the binaries" 中选择一个用于生成编译结果的目标文件夹,通常建议在源代码目录之外创建一个名为 "build" 的文件夹。
- 点击 "Configure" 按钮。CMake将提示你选择生成器,选择合适的Visual Studio版本(例如,Visual Studio 2022)。
- CMake编译过程中可能会报一些红色的错误的提示信息,解决办法看最后一节。
- 配置选项:在CMake配置过程中,可以根据需要设置不同的选项,如编译类型、安装路径、开启/关闭模块等。确保根据自己的需求进行配置。(网上搜索)
- 点击 "Generate" 按钮,这将生成一个Visual Studio项目文件。
- 打开生成的Visual Studio项目文件(通常是.sln文件)。
- 在Visual Studio中,选择 "Release" 或 "Debug" 配置(根据需要选择),然后点击 "生成"(Build)按钮。这将编译OpenCV。
- 编译完成后,可以在生成的目标文件夹中找到编译好的OpenCV库文件(通常在
build/install
文件夹下)。
2.配置 OpenCV 环境变量
- 使用键盘快捷键 Win + R 打开运行对话框。在运行对话框中,输入
sysdm.cpl
,然后按 Enter 键。这将直接打开系统属性窗口的 "高级" 选项卡,从那里访问环境变量配置。- 添加OpenCV的
bin
文件夹路径,以便系统可以找到OpenCV的DLL文件。例如:D:\Program Files\OpenCV\build\x64\vc16\bin
(请根据你的实际路径进行替换)。- 添加OpenCV的
lib
文件夹路径,以便编译器和连接器可以找到OpenCV的库文件。例如:D:\Program Files\OpenCV\build\x64\vc16\lib
(请根据你的实际路径进行替换)。- 确保点击了 "确定" 按钮,然后关闭所有窗口。
- 打开命令提示符,输入 opencv_version 命令,检查OpenCV是否配置成功。如果配置成功,会输出OpenCV的版本号,表明OpenCV库可在命令行中正常运行。
三,创建一个 Visual Studio 项目
使用Visual Studio创建一个新的C++项目,或者打开一个现有的项目。
四,配置 Visual Studio 项目
- 打开项目属性,选择 "配置属性 > VC++ 目录",然后将 "包含目录" 配置为包含OpenCV的
include
文件夹(opencv\build\include
),将 "库目录" 配置为包含OpenCV的lib
文件夹(opencv\build\x64\vc16\lib
)。- 在 "配置属性 > 链接器 > 输入" 下,将 "附加依赖项" 添加要使用的 OpenCV 库文件(例如 opencv_world480d.lib)。
五,编写并编译 OpenCV 程序
以下是一些基本图像处理程序
**1.加载和显示图像:**创建一个程序,能够加载图像文件并将其显示在窗口中。
cpp#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.调整图像大小:**编写代码,可以加载图像并调整其大小。
cpp#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.应用滤波器:学习如何应用常见的图像滤波器,例如高斯滤波器。
cpp#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.检测边缘:创建一个程序,用于检测图像中的边缘。
cpp#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颜色空间。
cpp#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 文件,再进行编译就行了。