前言
OpenCV3.X时代以后,OpenCV将代码库分成了两部分,分别是稳定的核心功能库和试验性质的contrib库(Extra Modules)。并且从3.1以后,编译好的版本中就没有现成的x86平台的库,只有x64平台的,想用就必须自己从源码编译,之前都是直接下载编译好的版本。
opencv:https://github.com/opencv/opencv/releases
opencv_contrib:https://github.com/opencv/opencv_contrib/releases
一、编译opencv库
1.环境及准备
Windows 10
VisualStudio 2017
CMake 3.19
OpenCV核心库源码
OpenCV contrib库源码
2.编译及安装
1、直接使用vcpkg一键编译最简单。(vcpkg使用配置)
.\vcpkg.exe install opencv3[contrib]:x86-windows
.\vcpkg.exe install opencv3[contrib]:x64-windows
.\vcpkg.exe export opencv3[contrib]:x86-windows opencv3[contrib]:x64-windows --zip
已编译版本:https://download.csdn.net/download/qing666888/13780914
2、使用CMake配置成VS2017工程,使用VS2017编译。具体步骤百度一下。
二、特征提取匹配
1.特征检测算法
特征检测提取算法,其中 SIFT和SURF都是需要使用nonfree module模块,即需要编译上面的opencv contrib模块。
"FAST" – FastFeatureDetector
"STAR" – StarFeatureDetector
"SIFT" – SIFT (nonfree module)
"SURF" – SURF (nonfree module)
"ORB" – ORB
"BRISK" – BRISK
"MSER" – MSER
"GFTT" – GoodFeaturesToTrackDetector
"HARRIS" – GoodFeaturesToTrackDetector with Harris detector enabled
"Dense" – DenseFeatureDetector
"SimpleBlob" – SimpleBlobDetector
Harris:用于检测角点
SIFT:用于检测斑点
SURF:用于检测斑点
FAST:用于检测角点
BRIEF:用于检测斑点
ORB:代表带有方向的FAST算法与具有旋转不变性的BRIEF算法
Harris,FAST都是用来检测角点的
SIFT(中的DOG),SURF(中的Hessian)是检测斑点的(关键点区域)
BRIEF也是检测斑点的。
ORB特征是基于FAST和BRIEF算法的,也是一种检测特征的算法
2.特征匹配算法
暴力匹配法
FLANN的匹配法
ORB特征匹配、K近邻特征匹配都是用暴力匹配法作为匹配器(BFMatcher )的
暴力匹配法由BFMatcher对象实现暴力匹配:
bf = cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck = True)
matches = bf.match(des1,des2)
FLANN算法由FlannBasedMatcher实现:
flann = cv2.FlannBasedMatcher(indexParams,searchParams)
matches = flann.knnMatch(des1,des2,k = 2)
暴力匹配多用于orb特征的匹配中:
orb = cv2.ORB_create()
kp1,des1 = orb.detectAndCompute(img1,None)
kp2,des2 = orb.detectAndCompute(img2,None)
FLANN多用于SIFT特征的匹配中:
sift = cv2.xfeatures2d.SIFT_create()
kp1,des1 = sift.detectAndCompute(queryImage,None)
kp2,des2 = sift.detectAndCompute(trainingImage,None)
上述代码非qt版本。
3.测试工程
效果如下,代码直接下载工程源码:
原图奉上,基于Qt的工程,使用SIFT特征提取算法,FLANN匹配算法。
代码如下:https://download.csdn.net/download/qing666888/13950031
总结
使用opencv进行图像识别检测的大概流程,首先对两张图片使用对应的检测算法,检测出图片的特征点,然后使用合适的特征匹配算法,判断两张待检测图片的特征点匹配情况。