0 前言
为什么要使用cmake+VS重新编译的opencv库?
使用opencv需要编译源码,得到库文件。可以用cmake构建项目后编译,也可以直接用官方提供的编译好的版本。官方提供的编译库一般只是标准版本,可能与某些库并不兼容,比如官方提供的编译好的版本与opengl就不兼容,这时就只能自己构建项目后编译。
1 安装环境
1.1 安装vs2015
Visual studio版本有很多,用的比较多的或者说兼容性比较好的还是VS2015和VS2017。我电脑上安装的是VS2015,如果是安装VS2017编译方法类似。
1.2 安装cmake
下载链接:https://cmake.org/download/,下载完之后直接解压即可。
1.3 下载opencv3.4和opencv_contrib-3.4
下载opencv可以到GitHub上或者清华镜像上也可以,GitHub网址:https://github.com/opencv,下载的时候注意前后版本统一。
2 Cmake编译
2.1 第一次编译
打开cmake-gui,在where is the source code输入opencv地址/sources地址;在where to build the libraries输入保存编译结果的地址。
点击Configure选择对应自己电脑上的VS版本的编译器,对于VS2015来说,32位的选择Visual Studio 14 2015,64位的选择Visual Studio 14 2015 Win64(如果是VS2017则选择Visual Studio 15 2017 Win64),点击finish后自动进行第一次编译。结果如下:
2.2 第二次编译
第一次编译完成后会显示编译opencv所需要的参数。在Name为OPENCV_EXTRA_MODULES_PATH的Value中填入opencv_contrib-3.0.0的路径/modules,如下图所示。
然后点击Configure进行第二次编译。
第二次编译完后一定要检查一下参数列表,如果参数列表还有红色标记的条目,就再尝试几次configure,直到所有条目都是白色为止。
2.2 Generate
点击Generate,直到出现Generate Done。这时候在我们的mybuild文件夹下可以看到编译出的文件。
3 生成库文件
1. 在build文件夹中,找到OpenCV.sln并打开
2. 在解决方案资源管理器中找到CMake Targets,右键点击“生成”
生成成功后,如果在build文件夹中还没有出现一个名为install的文件夹,回到VS界面,右击点击生产->批生成,选择如下:
我们在build\install\x64\v14\bin文件下可以看到生成的.dll文件
4 配置环境
4.1 系统环境变量
在计算机-环境变量-path中增加:where to build the binaries中设置的路径D:\Opencv3.4\opencv-3.4.4\build\install\x64\vc14\bin(这是我的路径,根据自己生成的文件夹的位置)
注意:如果是32位的VS的话,路径应该是where to build the binaries中设置的路径\install\x86\vc14\bin
另外,可以将下面两个路径也添加进去。
4.2 配置新的工程
打开VS2015,新建一个工程。找到属性管理器->Debug|x64->右击XX.user->属性
1. VC++目录-包含目录
D:\Opencv3.4\opencv-3.4.4\build\install\include
D:\Opencv3.4\opencv-3.4.4\source\include\opencv
D:\Opencv3.4\opencv-3.4.4\source\include\opencv2
2. VC++目录-库目录
D:\Opencv3.4\opencv-3.4.4\build\install\x64\vc14\lib
3. 链接器-输入-附加依赖项
这里添加的.lib文件都需要出现在<where to build the binaries中设置的路径>\install\x64\vc14\lib 中。如果lib文件被添加到附加依赖项里,但是上述文件夹中没有该lib文件,会出现找不到XXX.lib的错误。(以下是我的依赖项,根据opencv版本自己修改)
opencv_aruco344d.lib
opencv_bgsegm344d.lib
opencv_bioinspired344d.lib
opencv_calib3d344d.lib
opencv_ccalib344d.lib
opencv_core344d.lib
opencv_datasets344d.lib
opencv_dnn344d.lib
opencv_dnn_objdetect344d.lib
opencv_dpm344d.lib
opencv_face344d.lib
opencv_features2d344d.lib
opencv_flann344d.lib
opencv_fuzzy344d.lib
opencv_hfs344d.lib
opencv_highgui344d.lib
opencv_imgcodecs344d.lib
opencv_imgproc344d.lib
opencv_img_hash344d.lib
opencv_line_descriptor344d.lib
opencv_ml344d.lib
opencv_objdetect344d.lib
opencv_optflow344d.lib
opencv_phase_unwrapping344d.lib
opencv_photo344d.lib
opencv_plot344d.lib
opencv_reg344d.lib
opencv_rgbd344d.lib
opencv_saliency344d.lib
opencv_shape344d.lib
opencv_stereo344d.lib
opencv_stitching344d.lib
opencv_structured_light344d.lib
opencv_superres344d.lib
opencv_surface_matching344d.lib
opencv_text344d.lib
opencv_tracking344d.lib
opencv_video344d.lib
opencv_videoio344d.lib
opencv_videostab344d.lib
opencv_xfeatures2d344d.lib
opencv_ximgproc344d.lib
opencv_xobjdetect344d.lib
opencv_xphoto344d.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
5 开心时刻——测试
配了这么久踩了那么多坑,终于到检验成果的时刻了!
在项目中新建一个cpp,记得添加到工程里。输入如下代码:
#include <iostream>
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
Mat img = imread("original.jpg");//读入一张图片
namedWindow("test"); //创建一个名为Test窗口
imshow("test", img); //窗口中显示图像
waitKey(5000); //等待5000ms后窗口自动关闭
}