> 技术文档 > Visual Studio 2022 + OpenCV 4.8.0 + OpenCV_contrib 安装与环境配置_opencv 4.8.0下载

Visual Studio 2022 + OpenCV 4.8.0 + OpenCV_contrib 安装与环境配置_opencv 4.8.0下载

opencv_contrib 是OpenCV官方整合的一个拓展包,里面含有大量特征点检测、目标跟踪等算法API。

一、下载OpenCV源文件

1、OpenCV 4.8.0下载

首先去到Releases - OpenCV选择特定的opencv版本,我这里选择的是4.8.0,大家可以根据自己的需求选择需要的版本,下载完之后选择特定路径进行安装。

2、opencv_contrib下载

同样是去到opencv官方github的账号中寻找opencv_contrib模块,选择对应的版本,opencv_contrib的版本号一定要与opencv相同,这里我直接贴地址GitHub - opencv/opencv_contrib: Repository for OpenCV\'s extra modules

3、cmake下载

下载地址:Download CMake

我下载的是目前的最新版本cmake4.0.3,我的电脑为64位则选择了Windows x64 installer

二、opencv+opencv_contrib 编译

打开Cmake gui,Cmake用于编译opencv和opencv_contrib。首先来到opencv 4.8.0的安装路径下,找到sources文件,并将其填写至Where is source code;

在同路径下创建一个新的文件夹new_build,用于存放编译后的文件,同时将其路径填写至Where to build the binaries,如图所示。

然后点击左下角Configure,按要求填写你的VS版本号,点击Finish即可开始编译,

等待编译完成后查看是否有编译失败的模块,一般来说是有的。。出现了经典的问题,就是Cmake在下载的时候有些文档下载失败了,会记录在CmakeDownloadLog.txt里面

打开CmakeDownloadLog.txt,找到#cmake download,这类型的语句解析为#cmake download \"文件存放地址\" “文件下载地址”,所以我们只需要在文件下载地址中手动下载文件,再将其改名替换到文件存放地址处

0kb很明显为下载失败的标志

手动下载后将其替换

重新回到Cmake gui界面,再次点击Configure,会发现刚刚的红色内容已经全都消除,并显示configuring done

接下来我们要进行一些设置。在Search中输入BUILD_opencv_world,勾选此选项,这一步操作是将后续生成的lib文件夹下的所有.lib文件整合成一个opencv_world480d.lib文件和opencv_world480.lib文件,方便后续在VS中进行配置。其次,将OPENCV_ENABLE_NONFREE勾选上,确保SIFT特征点检测能正常使用。

OPENCV_EXTRA_MODULES_PATH则用来读取opencv_contrib源码路径,将在GitHub上下载的对应版本opencv_contrib中的modules文件夹输入OPENCV_EXTRA_MODULES_PATH,请注意这里要用斜杠/不能用反斜杠\\

以上设置完成后即可再次点击Configure,非常不幸,加入opencv_contrib后又有了cmakedownload的错误,依然是打开CmakeDownloadLog.txt,相同的解决方法,这边就不再多赘述。等到所有红色消除后再点击Generate

三、Visual Studio 生成

点击Cmake左下角Open Project,打开VS生成文件,点击生成——批生成

勾选Debug和Release下的ALL_BUILD和INSTALL进行批量生成,此步骤需要等待较长时间

生成结束,耗时44min

四、配置opencv编程环境

创建一个新的项目,我创建的是名为Opencv_learn的项目

点击VC++目录,其中包含目录添加D:\\opencv\\new_build\\install\\include\\opencv2和D:\\opencv\\new_build\\install\\include,库目录添加D:\\opencv\\new_build\\install\\lib。

点击链接器——输入,其中附加依赖项添加库目录下的lib文件,由于前面勾选了BUILD_OPENCV_world,则lib文件下的.lib文件被整合成一个world.lib文件,在Debug模式下添加D:\\opencv\\new_build\\install\\lib\\opencv_world480d.lib,Release模式下则添加D:\\opencv\\new_build\\install\\lib\\opencv_world480.lib,用绝对路径比较有保障。

最后,还要设置系统环境变量,打开查看高级系统设置——环境变量——系统变量——Path,添加D:\\opencv\\new_build\\install\\bin

如果之前有添加过相同版本的bin文件夹路径,可能会造成寻找.dll文件错误的情况,报的错是“无法定位程序输入点为xxx动态链接库.dll上”,原因在于opencv_world480.lib和opencv_world480d.lib对应的.dll文件都为opencv_world480.dll或者opencv_world480d.dll,在编译中可能会因为找寻到之前路径的.dll而报错。比如我之前编译的opencv_world480d.dll也存在于系统变量Path中,但编译时没加入opencv_contrib,那当我使用trackerKCF的时候,若opencv_world480d.lib通过系统链接到之前的opencv_world480d.dll,就会发现寻找不到trackerKCF相关的代码。

附录

付本人用于KCF目标跟踪的测试代码:

#include #include  // 需要 opencv_contrib#include using namespace cv;using namespace std;int main() { // 读取本地视频文件(请替换成你的视频路径) std::string videoPath = \"test_video.mp4\"; VideoCapture cap(videoPath); if (!cap.isOpened()) { cerr << \"无法打开视频文件: \" << videoPath << endl; return -1; } // 读取第一帧 Mat frame; cap.read(frame); if (frame.empty()) { cerr << \"无法读取第一帧!\" << endl; return -1; } // 用户选择初始目标区域 Rect2i roi = selectROI(\"选择跟踪目标\", frame, false, false); if (roi.width == 0 || roi.height == 0) { cout << \"未选择ROI,程序退出。\" << endl; return 0; } // 创建 KCF 跟踪器 Ptr tracker = TrackerKCF::create(); // 初始化跟踪器 tracker->init(frame, roi); while (true) { cap.read(frame); if (frame.empty()) break; // 更新跟踪器 bool ok = tracker->update(frame, roi); if (ok) { // 跟踪成功,画框 rectangle(frame, roi, Scalar(0, 255, 0), 2, 1); } else { // 跟踪失败 putText(frame, \"Tracking Failure\", Point(50, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2); } imshow(\"KCF 跟踪器\", frame); if (waitKey(30) == 27) break; // 按下 ESC 退出 } cap.release(); destroyAllWindows(); return 0;}