做计算机视觉的人恐怕没有人没有用过OpenCV这个著名的开源计算机视觉算法库。 OpenCV 仍在开发中。 最新版本3.4已经可以支持CNN了。 未来恐怕还会集成更多的功能。
但由于知识产权原因,OpenCV将很多算法放在opencv_contrib中。 在github上,这两段代码放在不同的仓库中。
OpenCV官方提供了windows可安装版本,已经编译了dll,但不包含opencv_contrib。 如果要使用这部分算法,需要自己编译opencv,将opencv_contrib编译成opencv。 下面简单介绍一下windows下编译opencv的过程。
所需材料:
1.下载opencv源码
源码地址为:,默认为master分支。 看来下载master分支就够了。 不过为了明确源码版本,方便后期匹配,我在tags中选择了最新版本,版本3.4.1,地址为:
代码可以通过git下载opencv3.4.1源码编译,只需使用gitclone命令即可。 您也可以点击网页上的红色按钮克隆或下载,然后点击downloadzip。
2.下载opencv_contrib源码
opencv_contrib代码地址为:
3.4.1版本的代码地址为:
相信你也发现了其中的规律。 参考下载opencv源码的方法即可。
上图是我解压后的目录,里面有opencv和opencv_contrib的解压目录,还有一个build目录用来放置cmake生成的vs工程。
3.安装cmake
CMake是一个跨平台的编译工具,可以输出各种makefile或项目文件。
下载链接:
直接下载运行,默认安装。
4.使用cmake生成vs项目
安装cmake后,运行cmake并填写前两项。
其中isthesourcecode是opencv源码路径,即“源码路径”
wheretobuildthebinaries是生成opencv的vs项目路径,即“目标路径”
单击“配置”,弹出对话框选择编译工程的平台。 我选择的是64位VS2015
单击“完成”开始配置。 这需要一定的时间,期间需要下载一些依赖项。 这时候,畅通的网络就起到了关键的作用。 如果下载不完整,可以通过查看日志文件CMakeDownloadLog.txt自动下载。 完成第一次配置后,将出现以下屏幕。
白色选项很多,说明有问题。 解决方法是再次单击“配置”。 这次速度快了很多,并且出现了以下屏幕。
如果一切都变成白色,则说明没有问题。 需要进行两处更改。
第一项是检查 BUILD_opencv_world 选项。 这样调用dll的时候就只调用这个了。 不需要根据功能来选择,省去了一些麻烦。
第二项自然是在OPENCV_EXTRA_MODULES_PATH选项中填写opencv_contrib解压目录下的modules文件夹的路径,这样opencv_contrib就被编译进去了。
然后按配置进行配置。 和上面一样,一次红两次白opencv3.4.1源码编译,就不细说了。 第二次全白了,就可以按Generate按钮生成vs工程文件了。
5.用VS2015编译opencv源码
工程生成完成后,可以在刚才提到的“目标路径”下看到OpenCV工程文件。
用vs2015打开工程文件,选择Debugx64,点击Generate ->Generate Solution开始编译。 这个过程比较漫长,需要耐心。 结果如下。
没有错误,然后右键INSTALL,点击“Only for project ->Generate INSTALL only”
可以编译生成dll相关文件。 编译过程如下。
然后将编译选项调整为Releaseex64并重复上述过程。 此时,调用dll的所有内容都在“目标路径”的安装目录下生成。
6.调用生成的dll实现图像处理功能
为了验证生成文件的有效性,创建一个新项目并将库目录和include目录指定为安装文件夹下的x64/vc14/lib和include文件夹。 处理图片和文字标准测试图片屋
测试代码如下:
#include "opencv2/opencv.hpp"
#include"opencv2/xfeatures2d.hpp"
#if _DEBUG
#pragma comment(lib,"opencv_world341d.lib")
#else
#pragma comment(lib,"opencv_world341.lib")
#endif // _DEBUG
using namespace cv;
using namespace std;
int main(){
Mat img = imread("E:/PASCAL/OpenCV/house.jpg",CV_LOAD_IMAGE_COLOR);
Ptr sift = xfeatures2d::SIFT::create();
vector keypoints;
Mat descriptors;
sift->detectAndCompute(img,noArray(),keypoints,descriptors);
drawKeypoints(img,descriptors,Scalar(0,255,255));
imshow("Result",descriptors);
waitKey(0);
return 0;
}
测试结果如下。
在contrib中实现了sift特征点的提取。