平台:win10 x64 +VS 2015专业版 +opencv-3.x.+CMake+Anaconda3(python3.7.0)
Issue说明:Opencv3.0版本已经发布了有一段时间,在这段时间也是不断的进行了更新和修复,最近看了一下3.0新增的一些功能,感觉还是蛮强大的,作为一个一直以Opencv为开发环境的程序员来说是一定要体验一下这个新版本的,特别看到说在tracking领域近年比较好的文章TLD和 KCF都有扩展包了,那更是要尝试一下。尝试用扩展包实现sift/surf算法。
原因:opencv从2.x到3.x是一个很大的转变,对于很多功能不完善、性能不稳定的模块,都被方法了extra_modules(扩展模块)里面了。这样倒是稳定了,但是对于我这样的新手,要添加这些扩展模块却是相当的痛苦啊!!因为要用到sift/surf算法,但是3.0以后这些算法都放到了在xfeacture模块中,并不在主模块中,于是就开始了艰难的配置过程。
解决办法:Win10 x64+vs2015+opencv3.4.1+附加模块opencv_contrib+cmake3.15.2编译和配置
目录:
一、下载地址汇总(OpenCV+OpenCV_contrib+CMake)
二、中间遇到的Issue汇总
三、主要参考链接
四、项目Issue
一、下载地址汇总(OpenCV+OpenCV_contrib+CMake)
OpenCV:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/
OpenCV_contrib:https://github.com/opencv/opencv_contrib/releases
CMake:https://cmake.org/download/
二、中间遇到的Issue汇总
Issue1:在github上下载资料,速度只有10几KB/s,下个opencv_contrib-3.4.1.zip,需要一个多小时!!!如何修改host文件加快github访问及下载速度?
答:进入目录C:WindowsSystem32driversetc并打开host文件
就是要将新的host添加到文件后面添加内容
访问:http://github.global.ssl.fastly.net.ipaddress.com/#ipinfo
查看IP地址(本人的是:151.101.185.194)
然后访问:http://github.com.ipaddress.com/#ipinfo
查看IP地址(本人的是:192.30.253.112)
然后将就可以,在host文件末尾添加新的数据(一定要另起一行哦!)
151.101.185.194 github.global.ssl.fastly.net
192.30.253.112 github.com
为了是host生效,
在cmd里输入如下指令
ipconfig /flushdns
参考:百度经验:github怎么修改host表下载——https://jingyan.baidu.com/article/ea24bc397265049a62b331d7.html
Issue2:我之前的电脑是Win10 x64+vs2015+opencv3.4.1(使用opencv-3.4.1-vc14_vc15.exe解压完成的,无附加模块opencv_contrib)+cmake3.13.4,参看网上 opencv3.0中contrib模块的添加——https://blog.csdn.net/streamchuanxi/article/details/51044929 配置一直报错?方案九(x64)、方案十(x86)成功!
答:网上opencv3.0中contrib模块的添加——https://blog.csdn.net/streamchuanxi/article/details/51044929中 从以下网址下载opencv源代码和扩展模块源代码(一定要从下面链接下载,实际此博客这块有错误!参看总结)。
OpenCV: https://github.com/Itseez/opencv
Extra Modules: https://github.com/Itseez/opencv_contrib
下载:opencv-master.zip+opencv_contrib-master.zip
然后点击“configure”按钮,更改内容,然后点击“configure”,回提示Generate Done。
在D:opencv3uild下找到OPENCV.sln,打开,找到CMakeTargets下的INSTALL,在Debug(或Release)下分别右键生成,经过40分钟左右报错!!!
方案一:上边网址:opencv3-master.zip+opencv_contrib-master.zip+vs 14 2015 x64(第一次点击“configure”按钮选择)
INSTALL生成时 报错100多项 警告100多项
方案二:上边网址:opencv3-master.zip+opencv_contrib-master.zip+vs 14 2015 win32(第一次点击“configure”按钮选择)
INSTALL生成时 报错100多项 警告100多项
官网下载opencv:opencv-master.zip+opencv_contrib-master.zip 链接:https://github.com/opencv
方案三:官网:opencv4-master.zip+opencv_contrib-master.zip+vs 14 2015 x64(第一次点击“configure”按钮选择)
INSTALL生成时 报错100多项 警告100多项
方案四:官网:opencv4-master.zip+opencv_contrib-master.zip+vs 14 2015 win32(第一次点击“configure”按钮选择)
INSTALL生成时 报错100多项 警告100多项
方案五:怀疑CMake版本问题,下载最新的CMake3.15.2(官网——CMake:https://cmake.org/download/)重试了方案一二三四
INSTALL生成时 报错100多项 警告100多项
方案六:怀疑Win10系统环境变量问题,去掉%JAVA_HOME%in;%MYSQL_HOME%in;D:WorkinguildOpenCVin;D:ProgramFilesgtk_-bundle_2.24.10_win32in;D:ProgramFilesMinGW-V5.1.6MinGWin重试了方案一二三四
INSTALL生成时 报错100多项 警告100多项
方案七:Win10+VS2017编译opencv3.2.0和opencv_contrib3.2.0来调用text模块——https://www.jianshu.com/p/4d49aa5e5656 中注意在安装VS2017的时候需要勾选使用C++的桌面开发这个选项,否则后面用CMake编译的时候可能会提示找不到C++编译器。(估计应该就是需要右边小红框里的那个东西,但是保险起见我还是全装了=-=) 怀疑VS2015安装问题,
在网上搜索VS2015未报此安装问题,另外自己安装博客也没有问题。
方案八:Win10+vs2015+opencv3.4.1+附加模块opencv_contrib+cmake3.11.0编译和配置——https://elody-07.github.io/opencv3.4.1+contrib+cmake3.11.0/#2-opencv3-4-1,重新下载opencv3.4.1+附加模块opencv_contrib
注意:opencv_contrib的版本一定要和opencv相同!!!下载:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip
官网:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip+vs 14 2015 win32(第一次点击“configure”按钮选择)
INSTALL生成时 报错,但是这一次只报了两个错误:1.const char不能赋值为char;2.模块计算机类型“x64”与目标计算机类型“X86”冲突
第一个错误通过定位(cv2.cpp的889行)修改“char* str = PyString_AsString(obj);”为“const char* str = PyString_AsString(obj);”解决
第二个错误无法修改
方案九:官网:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip+vs 14 2015 x64(第一次点击“configure”按钮选择)
INSTALL生成时 报错,但是这一次只报了两个错误:1.const char不能赋值为char;2.无法打开文件"python37_d.lib"
第一个错误通过定位(cv2.cpp的889行)修改“char* str = PyString_AsString(obj);”为“const char* str = PyString_AsString(obj);”解决
第二个错误解决方案 参考:无法打开文件“python35_d.lib”——https://blog.csdn.net/weixin_38383877/article/details/89891380
法一:(简单)全盘搜索python37.lib,把python37.lib复制粘贴后命名为python37_d.lib。(实际主要搜索是Anaconda3目录下,我的python37.lib两处在(1)C:UserswangAnaconda3libs,复制粘贴后命名为python37_d.lib;(2)C:UserswangAnaconda3pkgspython-3.7.0-hea74fb7_0libs,复制粘贴后命名为python37_d.lib)试了,生成不报错,重新生成还是报错!
法二:在 Anaconda3 的 pyconfig.h 文件中做出修改两处。(搜索:pyconfig.h ,实际主要搜索是Anaconda3目录下,我的pyconfig.h两处在(1)C:UserswangAnaconda3include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://# define Py_DEBUG;(2)C:UserswangAnaconda3pkgspython-3.7.0-hea74fb7_0include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://# define Py_DEBUG;) 试了,成功!!!
注意:我试了只修改法一,法二(1)处仍会报错无法打开文件"python37_d.lib" 。
方案十:更改python;参考:1)LNK1104 无法打开文件“python37_d.lib” 解决办法——https://blog.csdn.net/weixin_43788499/article/details/84933210
2)Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误——https://www.cnblogs.com/qilin20/p/10987398.html
具体实现:第一步:去掉Anaconda的路径。(我删除了系统环境变量:C:UserswangAnaconda3;C:UserswangAnaconda3Scripts;C:UserswangAnaconda3Libraryin;C:UserswangAnaconda3Librarymingw-w64in)
第二步:重新安装Python,确保你安装了python的debug版本,勾选最后一项Download debug binaries(requires VS 2015 or later),然后install。(Python官网:https://www.python.org/,下载了python-3.6.5-amd64.exe,安装参看:https://baijiahao.baidu.com/s?id=1606573927720991570&wfr=spider&for=pc,在高级选项中勾选最后一项Download debug binaries(requires VS 2015 or later))
第三步:检查Python的系统环境变量,若第二步没有添加,添加为新安装python的。(手动添加了系统环境变量:D:ProgramFilesPython36)
第四步:按方案八(官网:opencv-3.4.1-vc14_vc15.exe+opencv_contrib-3.4.1.zip+vs 14 2015 win32)配置,INSTALL生成时没有报错(错误0,警告66),成功!
第五步:测试代码Issue11报错:由于找不到 opencv_world341d.dll,无法继续执行代码。
解决方案:把D:ProgramFilesOpenCV3.4.1opencvmybuildinstallx86vc14in3个后缀是.dll(opencv_world341d.dll,opencv_ffmpeg341.dll,opencv_img_hash341d.dll)应用程序扩展复制到C:WindowsSysWOW64中,重新运行,成功!(参看:由于找不到 opencv_world320.dll,无法继续执行代——https://www.cnblogs.com/ganjiqi/p/8651350.html)
注意:64位系统用户需要注意,32位的DLL文件放在【C:WindowsSysWOW64】,64位的DLL文件放在“【C:WindowsSystem32】。
由于不用了Anaconda的python,更换了python,x86也成功了,所以,需要测试之前的方案。
目前测试方案一和方案三仍然fail,即INSTALL生成时 报错100多项 警告100多项
综上,方案九(x64)、方案十(x86)成功!
方案九(x64):Anaconda3(python3.7.0),配置x64可以,x86报错模块计算机类型“x64”与目标计算机类型“X86”冲突
方案十(x86):python3.6.5,配置x86和x64都可以。推荐!!!
方案十配置过程:
步骤一:下载python3.6.5+opencv3.4.1+opencv_contrib+cmake
见一、下载地址汇总(OpenCV+OpenCV_contrib+CMake)+方案十具体实现
步骤二:Cmake编译
见Issue3+Issue4+Issue6
步骤三:生成库文件
见Issue7
步骤四:配置系统环境变量和工程
见Issue9
步骤五:测试项目
见Issue11+Issue12
总结:(1)Win10+vs2015+opencv3.4.1+附加模块opencv_contrib+cmake3.11.0编译和配置——https://elody-07.github.io/opencv3.4.1+contrib+cmake3.11.0/#2-opencv3-4-1
VS2015编译只能用下载编译好的cv3.x,而不能用下载好的opencv-master.zip。要使用下载编译好的cv3.x!!!有的博客这块有错误!
(2)在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib——https://www.cnblogs.com/jliangqiu2016/p/5597501.html
里面说明了:1)由于现在官方的opencv3.1.0要在x64上使用,而且在visual studio2013包括本身以后的平台上使用,怎么让其在以前的版本使用,也可以在x86机子上跑呢?这也就是要CMake的原因之一
2)CMake编译工具的选择:第一次导出时需要设置后面用来编译此OpenCV.sln工程的VS的版本(这里特别要注意的是,自己机器上是否装有相应的VS版本,如果没有装,还是要编译就会出错,可能是找不到对应的工具原因,以及选择X86和X64),这里用的是VS 2015,也可以选择Visual Studio 10,就能在VS2010上使用:
3)debug版本和release版本的区别:release版本需要用动态链接库?参看OpenCV:Debug和Release模式 && 静态和动态编译——https://www.cnblogs.com/king-lps/p/7758050.html
Issue3:1)CMake如何操作?2)Cmake编译第一次编译完成后会显示编译opencv所需要的参数。在Name为OPENCV_EXTRA_MODULES_PATH的Value中填入opencv_contrib-3.0.0的路径/modules(我的为:D:ProgramFilesOpenCV3opencvopencv_contrib-3.4.1modules),添加后报错?3)Cmake编译第一次编译后需要更改哪些参数?4)第二次编译注意事项?
1)CMake使用?
答:安装cmake后,打开bin目录下的cmake-gui.exe
在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,点击finish后自动进行第一次编译
2)路径问题!
答:windows系统的路径问题,是“”,而CMake路径应为“/”,所以更改为D:/ProgramFiles/OpenCV3/opencv/opencv_contrib-3.4.1/modules
3)Cmake编译第一次编译后需要更改哪些参数?
答:四个参数:
1)选择 BUILD_opencv_world;
2)OPENCV_EXTRA_MODULES_PATH 中要填入contrib-master下的modules目录;一定要是“/”
3)选择OPENCV_ENABLE_NONFREE
4)去掉BUILD_opencv_hdf——第一次编译后找不到,第二次编译后才能找到!
参考:OpenCV4.0群的VS+opencv配置文档:Windows环境下最新OpenCV代码的-下载-编译-使用(2018-9重制).pptx
4)第二次编译注意事项?
答:在第一次编译后更改完四个参数后,第二次编译完后一定要检查一下参数列表,如果参数列表还有红色标记的条目及输出栏是否有报错(红色,主要是下载失败,参见Issue6),就再尝试几次configure,直到所有条目都是白色为止。
Issue4:Cmake编译好的个人建议?后面再忙活都是白干!没有xfeatures2d这类的文件?
答:【该步骤是个人建议】检查一下附加模版是否成功编译并加入到opencv中。如果附加模块opencv_contrib并未成功编译到opencv中,那后面再忙活都是白干。因为后面的步骤都比较费时,而且最终到了使用SIFT的时候才会发现附加模块增加失败,而且难以锁定原因,必须返回来逐步检查。所以个人建议不要跳过这一步,很简单。
方法:进入where to build the binaries中设置的目录,然后进入modules,查看一下是否有xfeatures2d这类的文件。这类文件是属于附加模版opencv_contrib的,如果没有,请检查一下CMake中参数列表里,OPENCV_EXTRA_MODULES_PATH的Value是否为opencv_contrib-3.0.0的路径/modules,如果不是,请重新设置OPENCV_EXTRA_MODULES_PATH的Value为opencv_contrib-3.0.0的路径/modules,然后重新configure、generate。如果附加模块opencv_contrib并未成功编译到opencv中,那后面就够忙活的了,后面更费时,而且最终会配置失败,还难以想到。
(我检查了我的路径D:ProgramFilesOpenCV3opencvmybuildmodules下没有xfeatures2d这类的文件,一直重新configure、generate还是没有,最后在D:ProgramFilesOpenCV3opencvmybuildmodules.firstpass下找到了,不知道是不是更改了,反正和网上说的不太一样,在modules下的.firstpass文件夹下。)
参考:【图像处理】windows 10 + vs2015+ opencv3.0.0 +附加模块opencv_contrib编译和配置——https://blog.csdn.net/chentravelling/article/details/59540828
Issue5:Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误——https://www.cnblogs.com/qilin20/p/10987398.html
答:方案十给出,CMake配置时一定要注意Python的安装路径。在此说明VS配置若一直失败,一定要更改Python。
Issue6:关于CMke配置的问题:opencv_ffmpeg.dll;opencv_ffmpeg_64.dll;face_landmark_model.dat一直下载失败?
答:打开mybuild下CMakeDownloadLog.txt,里边有下载链接,把链接传至手机下载后,再把文件传到CMakeDownloadLog.txt中说明的文件夹下。
(我的CMakeDownloadLog.txt路径是D:ProgramFilesOpenCV3opencvmybuild,下载完成后opencv_ffmpeg.dll;opencv_ffmpeg_64.dll放置D:ProgramFilesOpenCV3opencvmybuild3rdpartyffmpeg下,face_landmark_model.dat放置D:ProgramFilesOpenCV3opencvmybuild estdatacvface下,注意这里可能没有testdata,cv,face文件夹,按照CMakeDownloadLog.txt给出的路径依次建立即可。)
Issue7:VS2015在解决方案资源管理器中找到CMake Targets,右键点击“生成”的问题?
答:步骤一: 在解决方案资源管理器中找到CMake Targets,右键点击“生成”(大概40分钟,我的电脑比较渣,50分钟呢)。
步骤二:生成成功后,如果在mybuild文件夹中还没有出现一个名为install的文件夹,回到VS界面,右击INSTALL->仅用于项目->仅生成INSTALL,再次生成成功后就会出现install文件夹。
(我的路径是D:ProgramFilesOpenCV3opencvmybuild,经检查,mybuild下有了install文件夹。)
但是我使用的是:
步骤一:在“解决方案'OpenCV'(100多个项目)”上面点击右键-->重新生成解决方案。(也得接近45分钟呢。)
步骤二:找到CMakeTargets中的INSTALL,然后右键选择“仅限于项目”-->“仅生成INSTALL”,然后就在D:ProgramFilesOpenCV3opencvmybuildinstall中多了许多东东。
参看:Windows环境下编译OpenCV3.0和OpenCV_contrib【原创】——https://segmentfault.com/a/1190000003496009
Issue8:无法打开文件 无法打开文件‘python37_d.lib’?
答:生成INSTALL时,我碰到过的问题,问题是:无法打开文件‘python37_d.lib’
原因是我之前在电脑上安装了Anaconda3,openCV用Cmake编译时都检测到了。解决方法是打开python3对应的pyconfig.h文件,做两处修改。
(搜索:pyconfig.h ,实际主要搜索是Anaconda3目录下,我的pyconfig.h两处在(1)C:UserswangAnaconda3include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://# define Py_DEBUG;(2)C:UserswangAnaconda3pkgspython-3.7.0-hea74fb7_0include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://# define Py_DEBUG;)
在方案九中的法二已有说明!
Issue9:添加系统环境变量?
答:在计算机-环境变量-path中增加CMake:where to build the binaries中设置的路径installx64vc14in
(我的是D:ProgramFilesOpenCV3opencvmybuildinstallx64vc14in)
Issue10:配置新的工程?
答:打开VS2015,新建一个工程
找到属性管理器->Debug|x64->右击Microsoft.Cpp.x64.user->属性
1)VC++目录-包含目录
<where to build the binaries中设置的路径>installinclude
<where to build the binaries中设置的路径>installincludeopencv
<where to build the binaries中设置的路径>installinclude<opencv2>
2)VC++目录-库目录
<where to build the binaries中设置的路径>installx64vc14lib
3)链接器-输入-附加依赖项
这里添加的.lib文件都需要出现在<where to build the binaries中设置的路径>installx64vc14lib 中。如果lib文件被添加到附加依赖项里,但是上述文件夹中没有该lib文件,会出现找不到XXX.lib的错误。
(我的where to build the binaries中设置的路径是D:ProgramFilesOpenCV3opencvmybuild)
Issue11:测试?
答:在工程项目中新建一个cpp,记得添加到工程里。输入如下代码:
#include <iostream>
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
Mat img = imread("D:/Working/opencvimg/lena.jpg");//读入一张图片,更改为自己电脑需要调用的图片的路径和图片名称。
namedWindow("Test"); //创建一个名为Test窗口
imshow("Test", img); //窗口中显示图像
waitKey(5000); //等待5000ms后窗口自动关闭
}
选择Debug,x64,运行代码。
三、主要参考链接:
1)Win10+vs2015+opencv3.4.1+附加模块opencv_contrib+cmake3.11.0编译和配置——https://elody-07.github.io/opencv3.4.1+contrib+cmake3.11.0/#2-opencv3-4-1
2)【图像处理】windows 10 + vs2015+ opencv3.0.0 +附加模块opencv_contrib编译和配置——https://blog.csdn.net/chentravelling/article/details/59540828
3)opencv3.0中contrib模块的添加——https://blog.csdn.net/streamchuanxi/article/details/51044929
4)Opencv3.0和contribute模块的下载 编译 安装——https://blog.csdn.net/u012462822/article/details/49100025#comments
5)在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib——https://www.cnblogs.com/jliangqiu2016/p/5597501.html
以上Issue是关于VS2015配置opencv3.0中contrib模块的,以下Issue针对项目。
四、项目Issue:
Issue12:测试SIFT代码?
答:在工程项目中新建一个cpp,记得添加到工程里。输入如下代码:
#include <opencv2/opencv.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp> #include <iostream> using namespace cv::xfeatures2d; using namespace std; using namespace cv; // 计算图像的SIFT特征及匹配 float cacSIFTFeatureAndCompare(cv::Mat srcImage1, cv::Mat srcImage2, float paraHessian) { CV_Assert(srcImage1.data != NULL && srcImage2.data != NULL); // 转换为灰度 cv::Mat grayMat1, grayMat2; cv::cvtColor(srcImage1, grayMat1, CV_RGB2GRAY); cv::cvtColor(srcImage2, grayMat2, CV_RGB2GRAY); // 初始化SIFT检测描述子 cv::Ptr<Feature2D> sift = xfeatures2d::SIFT::create(); // 关键点及特征描述矩阵声明 vector<cv::KeyPoint> keyPoints1, keyPoints2; cv::Mat descriptorMat1, descriptorMat2; sift->detectAndCompute(grayMat1, Mat(), keyPoints1, descriptorMat1); sift->detectAndCompute(grayMat2, Mat(), keyPoints2, descriptorMat2); float result = 0; // 特征点匹配 if (keyPoints1.size() > 0 && keyPoints2.size() > 0) { // 计算特征匹配点 cv::FlannBasedMatcher matcher; vector< cv::DMatch > matches; std::vector<cv::DMatch> viewMatches; matcher.match(descriptorMat1, descriptorMat2, matches); // 最优匹配判断 double minDist = 100; for (int i = 0; i < matches.size(); i++) { if (matches[i].distance < minDist) minDist = matches[i].distance; } // 计算距离特征符合要求的特征点 int num = 0; std::cout << "minDist: " << minDist << std::endl; for (int i = 0; i < matches.size(); i++) { // 特征点匹配距离判断 if (matches[i].distance <= 2 * minDist) { result += matches[i].distance * matches[i].distance; viewMatches.push_back(matches[i]); num++; } } // 匹配度计算 result /= num; // 绘制特征点匹配结果 cv::Mat matchMat; cv::drawMatches(srcImage1, keyPoints1, srcImage2, keyPoints2, matches, matchMat); cv::imshow("matchMat", matchMat); cv::waitKey(0); } return result; } int main() { // 读取源图像及待匹配图像 cv::Mat srcImage1 = cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", 1); if (srcImage1.empty()) return -1; cv::Mat srcImage2 = cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", 1); if (srcImage2.empty()) return -1; float matchRate = cacSIFTFeatureAndCompare(srcImage1, srcImage2, 1000); std::cout << "matchRate: " << matchRate << std::endl; return 0; }
测试SURF代码?
在工程项目中新建一个cpp,记得添加到工程里。输入如下代码:
#include <opencv2/opencv.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp> #include <iostream> using namespace cv::xfeatures2d; using namespace std; using namespace cv; // 计算图像的SURF特征及匹配 float cacSURFFeatureAndCompare(cv::Mat srcImage1, cv::Mat srcImage2, float paraHessian) { CV_Assert(srcImage1.data != NULL && srcImage2.data != NULL); // 转换为灰度 cv::Mat grayMat1, grayMat2; cv::cvtColor(srcImage1, grayMat1, CV_RGB2GRAY); cv::cvtColor(srcImage2, grayMat2, CV_RGB2GRAY); // 初始化SURF检测描述子 cv::Ptr<Feature2D> surf = xfeatures2d::SURF::create(); // 关键点及特征描述矩阵声明 vector<cv::KeyPoint> keyPoints1, keyPoints2; cv::Mat descriptorMat1, descriptorMat2; surf->detectAndCompute(grayMat1, Mat(), keyPoints1, descriptorMat1); surf->detectAndCompute(grayMat2, Mat(), keyPoints2, descriptorMat2); float result = 0; // 特征点匹配 if (keyPoints1.size() > 0 && keyPoints2.size() > 0) { // 计算特征匹配点 cv::FlannBasedMatcher matcher; vector< cv::DMatch > matches; std::vector<cv::DMatch> viewMatches; matcher.match(descriptorMat1, descriptorMat2, matches); // 最优匹配判断 double minDist = 100; for (int i = 0; i < matches.size(); i++) { if (matches[i].distance < minDist) minDist = matches[i].distance; } // 计算距离特征符合要求的特征点 int num = 0; std::cout << "minDist: " << minDist << std::endl; for (int i = 0; i < matches.size(); i++) { // 特征点匹配距离判断 if (matches[i].distance <= 2 * minDist) { result += matches[i].distance * matches[i].distance; viewMatches.push_back(matches[i]); num++; } } // 匹配度计算 result /= num; // 绘制特征点匹配结果 cv::Mat matchMat; cv::drawMatches(srcImage1, keyPoints1, srcImage2, keyPoints2, matches, matchMat); cv::imshow("matchMat", matchMat); cv::waitKey(0); } return result; } int main() { // 读取源图像及待匹配图像 cv::Mat srcImage1 = cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", 1); if (srcImage1.empty()) return -1; cv::Mat srcImage2 = cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", 1); if (srcImage2.empty()) return -1; float matchRate = cacSURFFeatureAndCompare(srcImage1, srcImage2, 1000); std::cout << "matchRate: " << matchRate << std::endl; return 0; }
注意:(1)选择Debug,x64,运行代码。
(2)图片的路径!(我的图片中设置的路径是D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg和D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg)
参考:《OpenCV图像处理编程实例》朱伟等著
Issue13:运行SIFT/SURF代码错误?
答:若选择Debug,x86报错:LNK1104 无法打开文件“opencv_img_hash341d.lib”
原因:在编译时配置的是x64,而x86无法调用x64的包
解决:在编译时配置x86,但还未实验,在前面的方案中配置x86失败了,提示:模块计算机类型“x64”与目标计算机类型“X86”冲突
若选择Release,x64报错:发生生成错误,无法解析的外部符号。
原因:在Issue10:配置新的工程中属性管理器->Debug|x64->右击Microsoft.Cpp.x64.user->属性,只配置了Debug|x64
解决:配置新的工程中属性管理器->Release|x64->右击Microsoft.Cpp.x64.user->属性