opencv3.0中contrib模块的添加+实现SIFT/SURF算法
平台: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:\Windows\System32\drivers\etc并打开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:\opencv3\build下找到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%\bin;%MYSQL_HOME%\bin\;D:\Working\buildOpenCV\bin;D:\ProgramFiles\gtk_-bundle_2.24.10_win32\bin;D:\ProgramFiles\MinGW-V5.1.6\MinGW\bin重试了方案一二三四
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:\Users\wang\Anaconda3\libs,复制粘贴后命名为python37_d.lib;(2)C:\Users\wang\Anaconda3\pkgs\python-3.7.0-hea74fb7_0\libs,复制粘贴后命名为python37_d.lib)试了,生成不报错,重新生成还是报错!
法二:在 Anaconda3 的 pyconfig.h 文件中做出修改两处。(搜索:pyconfig.h ,实际主要搜索是Anaconda3目录下,我的pyconfig.h两处在(1)C:\Users\wang\Anaconda3\include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://# define Py_DEBUG;(2)C:\Users\wang\Anaconda3\pkgs\python-3.7.0-hea74fb7_0\include,记事本打开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:\Users\wang\Anaconda3;C:\Users\wang\Anaconda3\Scripts;C:\Users\wang\Anaconda3\Library\bin;C:\Users\wang\Anaconda3\Library\mingw-w64\bin)
第二步:重新安装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:\ProgramFiles\Python36)
第四步:按方案八(官网: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:\ProgramFiles\OpenCV3.4.1\opencv\mybuild\install\x86\vc14\bin3个后缀是.dll(opencv_world341d.dll,opencv_ffmpeg341.dll,opencv_img_hash341d.dll)应用程序扩展复制到C:\Windows\SysWOW64中,重新运行,成功!(参看:由于找不到 opencv_world320.dll,无法继续执行代——https://www.cnblogs.com/ganjiqi/p/8651350.html)
注意:64位系统用户需要注意,32位的DLL文件放在【C:\Windows\SysWOW64】,64位的DLL文件放在“【C:\Windows\System32】。
由于不用了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:\ProgramFiles\OpenCV3\opencv\opencv_contrib-3.4.1\modules),添加后报错?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:\ProgramFiles\OpenCV3\opencv\mybuild\modules下没有xfeatures2d这类的文件,一直重新configure、generate还是没有,最后在D:\ProgramFiles\OpenCV3\opencv\mybuild\modules\.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:\ProgramFiles\OpenCV3\opencv\mybuild,下载完成后opencv_ffmpeg.dll;opencv_ffmpeg_64.dll放置D:\ProgramFiles\OpenCV3\opencv\mybuild\3rdparty\ffmpeg下,face_landmark_model.dat放置D:\ProgramFiles\OpenCV3\opencv\mybuild\testdata\cv\face下,注意这里可能没有testdata,cv,face文件夹,按照CMakeDownloadLog.txt给出的路径依次建立即可。)
Issue7:VS2015在解决方案资源管理器中找到CMake Targets,右键点击“生成”的问题?
答:步骤一: 在解决方案资源管理器中找到CMake Targets,右键点击“生成”(大概40分钟,我的电脑比较渣,50分钟呢)。
步骤二:生成成功后,如果在mybuild文件夹中还没有出现一个名为install的文件夹,回到VS界面,右击INSTALL->仅用于项目->仅生成INSTALL,再次生成成功后就会出现install文件夹。
(我的路径是D:\ProgramFiles\OpenCV3\opencv\mybuild,经检查,mybuild下有了install文件夹。)
但是我使用的是:
步骤一:在“解决方案'OpenCV'(100多个项目)”上面点击右键-->重新生成解决方案。(也得接近45分钟呢。)
步骤二:找到CMakeTargets中的INSTALL,然后右键选择“仅限于项目”-->“仅生成INSTALL”,然后就在D:\ProgramFiles\OpenCV3\opencv\mybuild\install中多了许多东东。
参看: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:\Users\wang\Anaconda3\include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://# define Py_DEBUG;(2)C:\Users\wang\Anaconda3\pkgs\python-3.7.0-hea74fb7_0\include,记事本打开pyconfig.h,1)查找python37_d.lib,改为python37.lib;2)查找Py_DEBUG,注销://# define Py_DEBUG;)
在方案九中的法二已有说明!
Issue9:添加系统环境变量?
答:在计算机-环境变量-path中增加CMake:where to build the binaries中设置的路径\install\x64\vc14\bin
(我的是D:\ProgramFiles\OpenCV3\opencv\mybuild\install\x64\vc14\bin)
Issue10:配置新的工程?
答:打开VS2015,新建一个工程
找到属性管理器->Debug|x64->右击Microsoft.Cpp.x64.user->属性
1)VC++目录-包含目录
<where to build the binaries中设置的路径>\install\include
<where to build the binaries中设置的路径>\install\include\opencv
<where to build the binaries中设置的路径>\install\include\<opencv2>
2)VC++目录-库目录
<where to build the binaries中设置的路径>\install\x64\vc14\lib
3)链接器-输入-附加依赖项
这里添加的.lib文件都需要出现在<where to build the binaries中设置的路径>\install\x64\vc14\lib 中。如果lib文件被添加到附加依赖项里,但是上述文件夹中没有该lib文件,会出现找不到XXX.lib的错误。
(我的where to build the binaries中设置的路径是D:\ProgramFiles\OpenCV3\opencv\mybuild)
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 = ;
// 特征点匹配
if (keyPoints1.size() > && keyPoints2.size() > )
{
// 计算特征匹配点
cv::FlannBasedMatcher matcher;
vector< cv::DMatch > matches;
std::vector<cv::DMatch> viewMatches;
matcher.match(descriptorMat1, descriptorMat2, matches);
// 最优匹配判断
double minDist = ;
for (int i = ; i < matches.size(); i++)
{
if (matches[i].distance < minDist)
minDist = matches[i].distance;
}
// 计算距离特征符合要求的特征点
int num = ;
std::cout << "minDist: " << minDist << std::endl;
for (int i = ; i < matches.size(); i++)
{
// 特征点匹配距离判断
if (matches[i].distance <= * 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();
}
return result;
}
int main()
{
// 读取源图像及待匹配图像
cv::Mat srcImage1 =
cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", );
if (srcImage1.empty())
return -;
cv::Mat srcImage2 =
cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", );
if (srcImage2.empty())
return -;
float matchRate = cacSIFTFeatureAndCompare(srcImage1, srcImage2, );
std::cout << "matchRate: " << matchRate << std::endl;
return ;
}
OpenCV_SIFT
测试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 = ;
// 特征点匹配
if (keyPoints1.size() > && keyPoints2.size() > )
{
// 计算特征匹配点
cv::FlannBasedMatcher matcher;
vector< cv::DMatch > matches;
std::vector<cv::DMatch> viewMatches;
matcher.match(descriptorMat1, descriptorMat2, matches);
// 最优匹配判断
double minDist = ;
for (int i = ; i < matches.size(); i++)
{
if (matches[i].distance < minDist)
minDist = matches[i].distance;
}
// 计算距离特征符合要求的特征点
int num = ;
std::cout << "minDist: " << minDist << std::endl;
for (int i = ; i < matches.size(); i++)
{
// 特征点匹配距离判断
if (matches[i].distance <= * 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();
}
return result;
}
int main()
{
// 读取源图像及待匹配图像
cv::Mat srcImage1 =
cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand1.jpg", );
if (srcImage1.empty())
return -;
cv::Mat srcImage2 =
cv::imread("D:/Working/VS2015Projects/firstopencv082101/OpenCV2019082101/images/hand3.jpg", );
if (srcImage2.empty())
return -;
float matchRate = cacSURFFeatureAndCompare(srcImage1, srcImage2, );
std::cout << "matchRate: " << matchRate << std::endl;
return ;
}
OpenCV_SURF
注意:(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->属性
opencv3.0中contrib模块的添加+实现SIFT/SURF算法的更多相关文章
- 【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别
前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...
- Android 6.0中在/dev下添加新设备驱动下Selinux相关设置【转】
本文转载自:https://blog.csdn.net/fantasy_wxe/article/details/52013922 错误1: 07-23 13:06:57.617 117 117 ...
- 在OpenCV3.1.0中使用SIFT,SURF算法
写在前边: 1.我使用的是python2.7 + OpenCV3.1.0 2.OpenCV3.0.0+的文档有很大问题,很多文档写的还是OpenCV2.0+, OpenCV3.0+根本用不了,其中有一 ...
- opencv3.0配置opencv_contrib
在opencv3.0中无法直接使用sift,surf等特征点检测算子,需要额外配置opencv_contrib. 在查看网上诸多教程,失败n次后,终于找到了正确的配置方式. visual studio ...
- Windows环境中编译opencv3.0同时加入OPENCV_contrib库及解决遇到相关问题[contrib 必须要3.1以上的opencv才支持了]
更新:现在contrib库必须要opencv3.1以上才能支持编译通过了. 方法和步骤还是和本篇文章一样. ############################################## ...
- OpenCV3.1.0中调用MHI(Motion History Images, 运动历史图像)
写在前边: OpenCV3.0+要想使用MHI,就要现安装扩展模块opencv_contrib.安装方法见:ubuntu 14.04 64位 安装Opencv3.1.0 (包含opencv_contr ...
- VC++ 6.0中添加库文件和头文件
附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在& ...
- VC6.0中添加库文件和头文件
附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools>Options>Directories>Include files. 对于特定项目的头文件包含,在“ ...
- VC 6.0中添加库文件和头文件 【转】
本文转载自:http://blog.sina.com.cn/s/blog_9d3971af0102wxjq.html 加头文件包含 VC6.0中: VC6.0默认include包含路径:Tools&g ...
随机推荐
- JAVA 基础编程练习题44 【程序 44 偶数的素数和】
44 [程序 44 偶数的素数和] 题目:一个偶数总能表示为两个素数之和. package cskaoyan; public class cskaoyan44 { @org.junit.Test pu ...
- VICA概述及架构设计
VICA全称VAT Invoice Client Platform(增值税发票客户端平台),顾名思义就是公司增值税发票业务相关处理的客户端集成平台.在VICA出现之前,公司发票开具的技术主要是依赖于A ...
- Java工程师学习指南第6部分:深入理解JVM虚拟机
本文整理了微信公众号[Java技术江湖]发表和转载过的JVM虚拟机相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧. JVM原理分析,看了都说好 JVM 深入学习:Java 解析 Cl ...
- 洛谷 题解 P1220 【关路灯 】
搜索 传参 inline void DFS(int now,int l,int r,int cnt,int sum,int k) /* now为当前点 l为左端点 r为右端点 cnt为当前耗电量 su ...
- POJ 1161 Walls【floyd 以面为点建图】
题目链接:http://poj.org/problem?id=1161 题目大意: 1.给出m个区域,n个俱乐部点.接下来是n个俱乐部点以及各个区域由什么点围成.求一个区域到各个俱乐部点的距离之和最小 ...
- [转帖]iphone11的部分参数 UX
iPhone 11将于9月11号凌晨发布 靠谱爆料在这 https://www.cnbeta.com/articles/tech/884199.htm iphone的分辨率 非常高.. iphone ...
- 用java转换文件的字符集
中文乱码真的是让人很头疼问题,有了这个方法应该能缓解这种头疼,用的是递归方式查找文件,直接在原文件中修改,小心使用(在本地测试效果有点诡异呀,没有达到预期效果). package com.hy.uti ...
- linux利用crontab添加定时任务详解
crontab 作用:添加,查询,删除系统计划任务的指令. [root@localhost ~]# crontab [选项]选项: -e: 编辑crontab定时任务 -l: ...
- html当中如何引用js文件
3)html当中如何引用js文件 如果需要javascript工程师和html美工各干各的工作,需要分开写文件. 例 1.2 <html><head> <scrip ...
- 常见的几种web攻击
1. SQL注入 2. OS命令注入 3. 跨站脚本攻击(XSS) 4. HTTP首部注入 5. 会话劫持 6. 跨站点请求伪造(CSRF) 7. 点击劫持 8. DoS