OpenCV4.5.2(+opencv_contrib)+CMake3.20.1+vs2017重新编译
本文仅做学习使用,若侵权,请留言删除
参考文献:
Windows下 Cmake + VS 编译 OpenCV (+ opencv_contribute)源码
OpenCV3.4.1+opencv_contrib编译:windows 10
win10下利用cmake和vs重新编译opencv源码
opencv编译之后找不到opencv_worldxxx.lib的原因
编译支持CUDA的Opencv4.2
OpenCV下载地址:https://opencv.org/releases/
opencv_contrib下载地址:https://github.com/opencv/opencv_contrib
20240206更新如下:
下载OpenCV460和opencv_contrib460用vs2019(vc16)和cmake3.28.3重新按照下列步骤编译,在输入wo查找BUILD_opencv_world时选择勾选,编译成功。
1、下载解压OpenCV452:
重新编译的理由是因为我们在用C++调用OpenCV时会碰到某些库文件没有的情况。所以一般自己下载源码,根据自己的需求生成依赖库会好一些,在这里我们下载Source源码:
下载完成后右键解压:
解压缩后将文件夹放入C盘并以版本号命名:
解压缩后里面内容如下,同时创建一个rebuild文件夹:
Win+R开启cmd后进入该文件夹,同时输入cmake-gui,可调用CMake:
首先点击Browse Source按键选择OpenCV452文件夹路径:
然后点击Browse Build按键选择OpenCV452/rebuild文件夹路径:
继续点击config,下拉选择自己的VS版本后,选择x64,点击Finish:
最后编译开始,在红框处可以看见变动:
这里第一次config的完成后,search 中查找一些参数进行相应操作:
输入wo查找BUILD_opencv_world,不要勾选,因为据说安装了anaconda会导致编译引入不正确,不能生成opencv_worldxxx.lib文件,
输入mo查找OPENCV_EXTRA_MODULES_PATH:将opencv_contrib文件下的modules的路径加入
输入NON朝招OPENCV_ENABLE_NONFREE勾选:
输入SET查找OPENCV_GENERATE_SETUPVARS不勾选:
输入test查找OPENCV_PERF_TESTS、BUILD_TESTS、BUILD_opencv_python_tests不勾选:
输入java查找BUILD_JAVA、BUILD_opencv_java_bingdings_generator不勾选:
输入python查找BUILD_opencv_python3、BUILD_opencv_python_bingdings_generator不勾选:
这些操作完成后,再次点击Configure,若上面仍有红色则再一次Configure直到没有为止:
此时contrib附加库会需要下载一些文件,一般会下载失败,我们需要找到rebuild文件下的CMakeDownloadLog.txt,其中各解释如下:
我们需要通过下载源地址将文件放在文件暂存路径里面,命名则是MD5_文件名。其中 .cmake 和 .i 文件需要右击另存为来保存。所有缓存文件在源文件下的 .cache 文件夹中:
操作完成后再次点击Configure:
此时在该区域不再爆红,则可以进行Generate操作:
出现 1 后,点击 2 ,下一步就是用VS进行源码编译
2、用vs2017编译OpenCV源代码
在Generate之后,我们进入opencv/rebuild文件下,可以看到工程文件,双击sln文件打开vs2017
打开vs2017页面如下,此时有两种模式:Debug和Release,在解决方案中找到CMakeTargets:
第一种模式Debug:选中CMakeTargets中的ALL_BUILD,右击生成或者重新生成:
完成后转换为Release模式,执行相同操作:
在Debug和Release两个版本都生成好以后,点击INSTALL右击——仅用于项目——仅生成INSTALL:
其下是我踩过的坑,按以上操作应该不会有坑:
vs2015编译OpenCV错误总结如下:
d:\users\humeme\desktop\opencv452\modules\dnn\misc\tensorflow\op_def.pb.h(17): fatal error C1189: #error: This file was generated by an older version of protoc which is (编译源文件 D:\Users\humeme\Desktop\opencv452\modules\dnn\misc\tensorflow\op_def.pb.cc)
解决方案:这是由于anaconda没有安装TensorFlow,安装上就可以。
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C1189 #error: This file was generated by an older version of protoc which is (编译源文件 D:\Users\humeme\Desktop\opencv440\modules\dnn\src\onnx\onnx_graph_simplifier.cpp) opencv_world D:\Users\humeme\Desktop\opencv440\modules\dnn\misc\onnx\opencv-onnx.pb.h 17
解决方案:这里是由于勾选了 BUILD_opencv_world 选项导致anaconda导入文件混乱,最好不勾选,需要的lib一个个导入。同时也有人说不需要生成opencv_worldxxxd.lib,因为实际工程中会造成大量的冗余
OpenCV配置VS实例验证:
新建项目Ctrl+Shift+N啊,重新命名以及选择文件保存路径:
在项目右边选择解决方案资源管理器:
点击源文件右击选择添加——新建项,新建cpp文件并命名:
新建后输入以下代码,注意修改图片的路径:
#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <stdio.h>
using namespace cv;
using namespace std;
int edgeThresh = 1;
Mat image, gray, edge, cedge;
// define a trackbar callback
static void onTrackbar(int, void*)
{
blur(gray, edge, Size(3, 3));
// Run the edge detector on grayscale
Canny(edge, edge, edgeThresh, edgeThresh * 3, 3);
cedge = Scalar::all(0);
image.copyTo(cedge, edge);
imshow("Edge map", cedge);
}
static void help()
{
printf("\nThis sample demonstrates Canny edge detection\n"
"Call:\n"
" /.edge [image_name -- Default is ../data/fruits.jpg]\n\n");
}
const char* keys =
{
"{help h||}{@image |../data/fruits.jpg|input image name}"
};
int main(int argc, const char** argv)
{
CommandLineParser parser(argc, argv, keys);
if (parser.has("help"))
{
help();
return 0;
}
//!!!!这里将 filename 换成你自己图片的绝对路径就可以了,只要修改这一处!!!!
string filename = "D:/VSCODE/canny_detect/111.png";
image = imread(filename, 1);
if (image.empty())
{
printf("Cannot read image file: %s\n", filename.c_str());
help();
return -1;
}
cedge.create(image.size(), image.type());
cvtColor(image, gray, COLOR_BGR2GRAY);
// Create a window
namedWindow("Edge map", 1);
// create a toolbar
createTrackbar("Canny threshold", "Edge map", &edgeThresh, 100, onTrackbar);
// Show the image
onTrackbar(0, 0);
// Wait for a key stroke; the same function arranges events processing
waitKey(0);
system("pause");
return 0;
}
选择属性管理器双击Microsoft.Cpp.x64.user:
选择VC++目录——包含目录:
D:\Users\humeme\Desktop\rebuild\install\include
D:\Users\humeme\Desktop\rebuild\install\include\opencv2
选择VC++目录——库目录
链接器——输入
opencv_aruco440.lib
opencv_aruco440d.lib
opencv_bgsegm440.lib
opencv_bgsegm440d.lib
opencv_bioinspired440.lib
opencv_bioinspired440d.lib
opencv_calib3d440.lib
opencv_calib3d440d.lib
opencv_ccalib440.lib
opencv_ccalib440d.lib
opencv_core440.lib
opencv_core440d.lib
opencv_datasets440.lib
opencv_datasets440d.lib
opencv_dnn440.lib
opencv_dnn440d.lib
opencv_dnn_objdetect440.lib
opencv_dnn_objdetect440d.lib
opencv_dnn_superres440.lib
opencv_dnn_superres440d.lib
opencv_dpm440.lib
opencv_dpm440d.lib
opencv_face440.lib
opencv_face440d.lib
opencv_features2d440.lib
opencv_features2d440d.lib
opencv_flann440.lib
opencv_flann440d.lib
opencv_fuzzy440.lib
opencv_fuzzy440d.lib
opencv_gapi440.lib
opencv_gapi440d.lib
opencv_hdf440.lib
opencv_hdf440d.lib
opencv_hfs440.lib
opencv_hfs440d.lib
opencv_highgui440.lib
opencv_highgui440d.lib
opencv_imgcodecs440.lib
opencv_imgcodecs440d.lib
opencv_imgproc440.lib
opencv_imgproc440d.lib
opencv_img_hash440.lib
opencv_img_hash440d.lib
opencv_intensity_transform440.lib
opencv_intensity_transform440d.lib
opencv_line_descriptor440.lib
opencv_line_descriptor440d.lib
opencv_ml440.lib
opencv_ml440d.lib
opencv_objdetect440.lib
opencv_objdetect440d.lib
opencv_optflow440.lib
opencv_optflow440d.lib
opencv_phase_unwrapping440.lib
opencv_phase_unwrapping440d.lib
opencv_photo440.lib
opencv_photo440d.lib
opencv_plot440.lib
opencv_plot440d.lib
opencv_quality440.lib
opencv_quality440d.lib
opencv_rapid440.lib
opencv_rapid440d.lib
opencv_reg440.lib
opencv_reg440d.lib
opencv_rgbd440.lib
opencv_rgbd440d.lib
opencv_saliency440.lib
opencv_saliency440d.lib
opencv_shape440.lib
opencv_shape440d.lib
opencv_stereo440.lib
opencv_stereo440d.lib
opencv_stitching440.lib
opencv_stitching440d.lib
opencv_structured_light440.lib
opencv_structured_light440d.lib
opencv_superres440.lib
opencv_superres440d.lib
opencv_surface_matching440.lib
opencv_surface_matching440d.lib
opencv_text440.lib
opencv_text440d.lib
opencv_tracking440.lib
opencv_tracking440d.lib
opencv_video440.lib
opencv_video440d.lib
opencv_videoio440.lib
opencv_videoio440d.lib
opencv_videostab440.lib
opencv_videostab440d.lib
opencv_xfeatures2d440.lib
opencv_xfeatures2d440d.lib
opencv_ximgproc440.lib
opencv_ximgproc440d.lib
opencv_xobjdetect440.lib
opencv_xobjdetect440d.lib
opencv_xphoto440.lib
opencv_xphoto440d.lib
将以上lib复制进去后一路确定退出。
最后点击生成——生成解决方案,在点击调试开始执行结果如下: