windows下编译以及使用OpenCV的方式
在windows下编译使用opencv有两种方式:
1、使用官网编译好的库,配置下环境变量和c++的库目录,包含目录include路径,链接器-输入里面填上opencv_worldxx.lib文件
2、使用cmake 按需编译所需要的库,例如使用一些第三方模块:wechat_qrcode,这个时候,就需要使用cmake编译opencv_contrib模块,以下详细的介绍两种使用方法:
第一种方法:
第一部分:下载 OpenCV
-
访问 OpenCV 官网的发布页面:
https://opencv.org/releases/ -
选择适合的 Windows 版本点击下载。对于初学者,推荐下载最新的稳定版(例如
OpenCV 4.9.0)。你会下载到一个名为opencv-4.9.0-windows.exe的文件。 -
双击运行这个
.exe文件。它实际上是一个自解压压缩包。选择一个你喜欢的路径进行解压,例如D:\Opencv。这很重要,后续配置需要用到这个路径。- 建议路径不要有中文和空格,以免引起不必要的麻烦。
-
解压完成后,你的 OpenCV 目录结构应该类似这样:
text
Copy
Download
D:\Opencv
└── build
├── include
├── x64
│ └── vc16
│ ├── bin
│ ├── lib
│ └── ...
└── ...build目录包含我们开发所需的头文件和库文件。include目录是头文件所在位置。x64目录下根据编译器版本区分(vc16= Visual Studio 2019,vc17= Visual Studio 2022)。请根据你使用的 VS 版本选择对应的文件夹。
第二部分:配置系统环境变量
这一步的目的是让系统能够找到 OpenCV 的 .dll (动态链接库) 文件。
-
在 Windows 搜索框输入“环境变量”,选择 “编辑系统环境变量”。
-
在弹出的窗口中,点击下方的 “环境变量(N)...” 按钮。
-
在“系统变量”区域中,找到并选中名为
Path的变量,然后点击 “编辑”。 -
点击 “新建”,然后添加你的 OpenCV 的
bin目录路径。- 对于 VS 2022,路径通常是:
D:\Opencv\build\x64\vc17\bin - 对于 VS 2019,路径通常是:
D:\Opencv\build\x64\vc16\bin
- 对于 VS 2022,路径通常是:
-
点击 “确定” 保存所有更改。
-
重要:为了使环境变量生效,你需要重启任何正在运行的 Visual Studio 实例。最好重启一下电脑,确保万无一失。
第三部分:在 Visual Studio 中配置项目
现在我们来创建一个新的 Visual Studio 项目并配置它。请注意,这些配置是针对每个项目进行的,也就是说,你新建一个项目,就需要重新配置一次。
步骤 1:创建新项目
- 打开 Visual Studio,选择 “创建新项目”。
- 选择 “控制台应用” 模板(C++),点击“下一步”。
- 为项目命名(例如
OpenCV_Test),选择位置,然后点击“创建”。
步骤 2:调整项目属性(关键步骤)
我们需要告诉 Visual Studio 去哪里找 OpenCV 的头文件(.hpp) 和库文件(.lib)。
-
确保顶部解决方案平台是
x64。OpenCV 预编译库是 x64 的,Debug 和 Release 模式都需要是 x64。- 默认可能是
Win32,点击下拉菜单选择x64。如果没有,选择“配置管理器”->“活动解决方案平台”->“新建”->选择“x64”。
- 默认可能是
-
在“解决方案资源管理器”中,右键点击你的项目名称,选择 “属性”。
-
确保顶部的“配置”和“平台”是你想要设置的(例如
Debug和x64)。我们先配置 Debug 模式。 -
配置 VC++ 目录:
-
包含目录:点击“包含目录”,点击下拉箭头->“编辑”。
- 添加你的 OpenCV 的
include路径:
D:\Opencv\build\include
D:\Opencv\build\include\opencv2 - (添加一个之后按回车再添加下一个)
- 添加你的 OpenCV 的
-
库目录:点击“库目录”,点击下拉箭头->“编辑”。
-
添加你的 OpenCV 的
lib路径:- 对于 VS 2022:
D:\Opencv\build\x64\vc17\lib - 对于 VS 2019:
D:\Opencv\build\x64\vc16\lib
- 对于 VS 2022:
-
-
-
配置 链接器 -> 输入 -> 附加依赖项:
- 在左侧列表中,找到“链接器”->“输入”。
- 在右侧点击“附加依赖项”,点击下拉箭头->“编辑”。
- 这里我们需要添加
.lib文件的名字。你需要去之前库目录(...\lib)下查看具体的文件名。 - 通常,对于 Debug 模式,你需要添加
opencv_world490d.lib(末尾的d代表 Debug)。 - 对于 Release 模式,你需要添加
opencv_world490.lib(没有d)。 - 注意:
490代表版本号 4.9.0,请根据你下载的实际版本进行修改。
-
重复配置:现在,在属性页顶部的“配置”下拉框中,选择
Release,然后重复第 4 步和第 5 步(库目录相同,但附加依赖项要改为不带d的.lib文件)。 -
点击“应用”和“确定”保存所有配置。
第四部分:测试代码
现在,让我们写一个简单的程序来测试配置是否成功。
在你的 main.cpp 文件中,粘贴以下代码。这段代码会读取一张图片并显示它
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 请确保在项目目录下有一名为 "test.jpg" 的图片
// 或者使用绝对路径,例如:Mat img = imread("D:/images/test.jpg");
Mat img = imread("test.jpg");
if (img.empty())
{
cout << "Could not open or find the image!" << endl;
return -1;
}
namedWindow("OpenCV Test", WINDOW_AUTOSIZE); // 创建一个窗口
imshow("OpenCV Test", img); // 在窗口中显示图片
waitKey(0); // 等待任意按键按下
return 0;
}
第二种方法:
由于 Windows 下预编译的 OpenCV 通常不包含 opencv_contrib 模块,因此需要从源码编译。下面是一个清晰的步骤指南,希望能帮你顺利完成。
🧰 编译前的准备
首先,你需要准备好以下工具和源码:
-
安装 Visual Studio:确保已安装 Visual Studio 2019 或 2022,并选择使用 C++ 的桌面开发 工作负载。
-
安装 CMake:从 CMake 官网 下载并安装 Windows 版本的 CMake。安装时记得勾选 "Add CMake to the system PATH for all users" 选项。
-
下载 OpenCV 及 opencv_contrib 源码:
- OpenCV 源码:从 OpenCV GitHub Releases 下载 OpenCV 4.10.0 的源码 zip 包(例如
opencv-4.10.0.zip)。 - opencv_contrib 源码:从 opencv_contrib GitHub Releases 下载与 OpenCV 版本匹配的 opencv_contrib 源码 zip 包(例如
opencv_contrib-4.10.0.zip)。 - 将这两个 zip 包解压到你能找到的目录,例如
D:\opencv\opencv-4.10.0和D:\opencv\opencv_contrib-4.10.0。务必确保两者的版本一致。
- OpenCV 源码:从 OpenCV GitHub Releases 下载 OpenCV 4.10.0 的源码 zip 包(例如
📦 编译步骤
编译 OpenCV 主要可以通过 CMake GUI 进行配置,然后用 Visual Studio 编译。
1. 使用 CMake GUI 配置项目
-
打开 CMake GUI。
-
设置源码路径和构建路径:
- 在 "Where is the source code:" 栏,选择你的 OpenCV 源码目录(例如
D:/opencv/opencv-4.10.0)。 - 在 "Where to build the binaries:" 栏,创建一个新的空目录作为构建目录(例如
D:/opencv/opencv-4.10.0/build)。在源码目录外新建构建目录是推荐的做法。
- 在 "Where is the source code:" 栏,选择你的 OpenCV 源码目录(例如
-
首次 Configure:
- 点击 "Configure" 按钮。
- 在弹出的对话框中,指定生成器(Generator)为你的 Visual Studio 版本和目标平台(例如 "Visual Studio 17 2022"),并选择 "Use default native compilers",平台可选
x64。 - 点击 "Finish"。CMake 会开始初始配置,这个过程可能会持续几分钟。
-
处理配置中的问题:首次配置后,可能会出现一些红色高亮的配置项。如果遇到网络问题导致某些文件(如
ippicv、ffmpeg、face_landmark_model.dat等)下载失败910,可以尝试:- 手动下载:根据
build/CMakeDownloadLog.txt日志中的 URL 手动下载这些文件。 - 修改 CMake 脚本:将相应
.cmake文件(如opencv_contrib/modules/xfeatures2d/cmake/download_boostdesc.cmake,opencv_contrib/modules/xfeatures2d/cmake/download_vgg.cmake,opencv/3rdparty/ippicv/ippicv.cmake等)中的下载 URL 替换为本地文件路径(例如file:///D:/opencv/downloads/face_landmark_model.dat)9。
- 手动下载:根据
-
指定 opencv_contrib 模块并设置关键选项:
-
在 CMake GUI 的搜索框中搜索
OPENCV_EXTRA_MODULES_PATH,并将其值设置为你的opencv_contrib源码中的modules目录的路径(例如D:/opencv/opencv_contrib-4.10.0/modules)125。 -
根据需求调整其他选项(以下是一些常见的)如果需要使用java环境下的,那在cmake下搜索java,并把对钩取消掉,同理,将所有test的相关项也取消掉,加快编译速度:
选项名 推荐设置 说明 BUILD_opencv_worldOFF(或 ON)是否将所有模块打包成一个 opencv_world.lib文件,方便管理,但文件较大。OPENCV_ENABLE_NONFREEON如果你想使用 SIFT、SURF 等专利算法,或者 wechat_qrcode,请务必开启。 WITH_CUDAOFF(或 ON)是否启用 CUDA 支持。如果你有 NVIDIA 显卡并需要 GPU 加速,可以开启。 BUILD_EXAMPLESON(或 OFF)是否编译示例代码。 BUILD_TESTSOFF是否编译测试代码,通常可以关闭以加快编译速度。 CMAKE_INSTALL_PREFIX指定安装目录,例如 D:/opencv/opencv-4.10.0/install。 -
再次点击 "Configure"。可能需要多次点击 "Configure" 直到没有新的红色条目出现。
-
点击 "Generate" 生成 Visual Studio 的解决方案文件(
.sln)。成功后会出现 "Generating done"。
-
2. 使用 Visual Studio 编译和安装
-
打开解决方案文件:在 CMake 指定的构建目录(例如
D:/opencv/opencv-4.10.0/build)中找到OpenCV.sln文件,用 Visual Studio 打开。 -
选择编译配置:在 Visual Studio 顶部的工具栏中,将解决方案配置(Solution Configuration)切换到
Release模式,平台选择x64。 -
编译:
- 在解决方案资源管理器(Solution Explorer)中,右键点击
ALL_BUILD项目,选择 "生成" (Build)。这个过程非常耗时(可能长达数小时),请耐心等待。 - 编译成功后,再右键点击
INSTALL项目,选择 "生成" (Build)。这会将编译好的文件复制到你在CMAKE_INSTALL_PREFIX中指定的安装目录。
- 在解决方案资源管理器(Solution Explorer)中,右键点击
3. 配置你的项目使用新编译的 OpenCV
编译安装完成后,你的安装目录(例如 D:/opencv/opencv-4.10.0/install)下会有 include, lib, bin 等文件夹。
-
环境变量:将安装目录下的
bin文件夹(例如D:\opencv\opencv-4.10.0\install\x64\vc17\bin)添加到系统的 Path 环境变量中,并重启电脑或至少重启 Visual Studio。 -
VS 项目配置:在你的项目属性中做如下设置8:
- VC++ 目录 > 包含目录:添加
D:\opencv\opencv-4.10.0\install\include - VC++ 目录 > 库目录:添加
D:\opencv\opencv-4.10.0\install\x64\vc17\lib(注意vc17对应 VS2022,vc16对应 VS2019) - 链接器 > 输入 > 附加依赖项:添加
opencv_world4100.lib(Release 模式) 或opencv_world4100d.lib(Debug 模式)。如果你没有开启BUILD_opencv_world,则需要添加所有你需要的模块对应的.lib文件(例如opencv_core4100.lib,opencv_imgproc4100.lib,opencv_wechat_qrcode4100.lib等)。
- VC++ 目录 > 包含目录:添加
⚡ 注意事项
- 版本匹配:务必确保
opencv和opencv_contrib的版本号完全一致35。 - 网络与下载:编译过程中下载第三方依赖是常见问题,手动干预是解决方案之一910。
- 编译时间:编译 OpenCV 需要较长时间,且对电脑硬件有一定要求。
- 磁盘空间:确保有足够的磁盘空间(至少 20-30GB 空闲空间)。
- 权限问题:确保 CMake 和 Visual Studio 有必要的文件系统写入权限。
- 文档参考:OpenCV 官方文档和
opencv_contrib仓库的 README 是最好的参考14。
总结一下使用opencv的方式
方法一:使用编译好的cmake模块文件
例如,我使用cmake编译好的文件目录在:E:\opencv\410source\builder\install,目录结构如下:

那么我创建一个使用opencv的makefile文件如下即可:
cmake_minimum_required(VERSION 3.10)
project(VedioTest)
# 设置OpenCV_DIR变量指向包含OpenCVConfig.cmake的目录
set(OpenCV_DIR "E:/opencv/410source/builder/install")
# 查找OpenCV包
find_package(OpenCV REQUIRED)
# 添加你的可执行文件
add_executable(${PROJECT_NAME} "main.cpp")
# 链接OpenCV库
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
测试代码如下:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
int main() {
std::cout << "OpenCV Camera Test" << std::endl;
std::cout << "OpenCV version: " << CV_VERSION << std::endl;
// 打开默认摄像头(0表示第一个摄像头)
cv::VideoCapture cap(0);
// 检查摄像头是否成功打开
if (!cap.isOpened()) {
std::cerr << "Error: Could not open camera!" << std::endl;
return -1;
}
std::cout << "Camera opened successfully!" << std::endl;
std::cout << "Press 'q' to quit" << std::endl;
// 创建窗口
cv::namedWindow("Camera", cv::WINDOW_NORMAL);
cv::resizeWindow("Camera", 800, 600);
cv::Mat frame;
while (true) {
// 读取一帧
cap >> frame;
// 检查是否成功读取
if (frame.empty()) {
std::cerr << "Error: Empty frame!" << std::endl;
break;
}
// 获取帧的尺寸
int width = frame.cols;
int height = frame.rows;
// 在画面上显示信息
cv::putText(frame,
"Camera Test - Press 'q' to quit",
cv::Point(50, 50),
cv::FONT_HERSHEY_SIMPLEX,
1.0,
cv::Scalar(0, 255, 0),
2);
// 显示分辨率
std::string resolution = "Resolution: " + std::to_string(width) + "x" + std::to_string(height);
cv::putText(frame,
resolution,
cv::Point(50, 100),
cv::FONT_HERSHEY_SIMPLEX,
0.8,
cv::Scalar(255, 255, 0),
1);
// 显示FPS(简化版)
cv::putText(frame,
"FPS: ~30",
cv::Point(50, 150),
cv::FONT_HERSHEY_SIMPLEX,
0.8,
cv::Scalar(255, 255, 0),
1);
// 显示图像
cv::imshow("Camera", frame);
// 等待按键,'q'退出
char key = cv::waitKey(1);
if (key == 'q' || key == 'Q') {
break;
}
}
// 释放摄像头
cap.release();
cv::destroyAllWindows();
std::cout << "Camera closed. Program ended." << std::endl;
return 0;
}
构建指令
# 在项目目录下
mkdir build
cd build
cmake .. -G "Visual Studio 16 2019" -A x64 # 根据你的VS版本调整
cmake --build . --config Release
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS}),新手的疑问是,这句一定要写吗,然后如果一定要写,我如何知道变量名是OpenCV_LIBS?
1. 为什么一定要写 target_link_libraries?
是的,必须写! 因为:
find_package只是发现了库的位置和信息target_link_libraries才是实际使用这些库进行链接
类比:
find_package= 找到图书馆的位置和藏书目录target_link_libraries= 真正从图书馆借出这些书来使用
2. 如何知道变量名是 OpenCV_LIBS?
方法1:查阅官方文档
OpenCV官方文档明确说明:
# OpenCV的CMake文档指出
OpenCV_LIBS # 包含所有需要链接的库
OpenCV_INCLUDE_DIRS # 包含所有头文件路径
OpenCV_VERSION # OpenCV版本
方法2:查看配置文件
你可以直接查看 OpenCVConfig.cmake 文件:
# 在linux系统中
cat "E:/opencv/410source/builder/install/OpenCVConfig.cmake" | grep -i "set.*lib"
# 在window系统中
使用记事本打开看下
你会看到类似:
set(OpenCV_LIBS opencv_world410)
set(OpenCV_LIBRARIES opencv_world410)
方法3:CMake的命名规范
OpenCV遵循CMake的通用命名约定:
| 变量类型 | 命名模式 | 示例 |
|---|---|---|
| 库列表 | <PackageName>_LIBS 或 <PackageName>_LIBRARIES |
OpenCV_LIBS |
| 包含目录 | <PackageName>_INCLUDE_DIRS |
OpenCV_INCLUDE_DIRS |
| 版本 | <PackageName>_VERSION |
OpenCV_VERSION |
| 定义 | <PackageName>_DEFINITIONS |
OpenCV_DEFINITIONS |
3. 还有其他可能的变量名
不同的包可能使用不同的变量名:
# OpenCV
target_link_libraries(myapp ${OpenCV_LIBS})
# 或
target_link_libraries(myapp ${OpenCV_LIBRARIES})
# Boost
target_link_libraries(myapp ${Boost_LIBRARIES})
# PCL
target_link_libraries(myapp ${PCL_LIBRARIES})
# ITK
target_link_libraries(myapp ${ITK_LIBRARIES})
总结
target_link_libraries必须写:这是实际使用库的步骤- 变量名来源于库的配置文件:OpenCV开发者定义了这些变量名
- 查阅文档是最可靠的方法:每个库的变量名可能不同
- 可以使用调试输出查看:在CMakeLists.txt中打印所有相关变量
- 现代CMake倾向于使用目标:如
opencv_core而不是变量
方法二:手动配置依赖
1、添加include
2、添加链接文件

浙公网安备 33010602011771号