import cv2

good = []
# 原始图片
queryImage = cv2.imread( 'wb1.jpg' , 0 )
# 目标图片
trainingImage = cv2.imread( 'wb2.jpg' , 0 )

# 创建SIFT对象(特征检测器),并计算灰度图像(描述符)
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(queryImage, None )
kp2, des2 = sift.detectAndCompute(trainingImage, None )

# 设置FLANN匹配器参数
FLANN_INDEX_KDTREE = 0
indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees= 5 )
searchParams = dict(checks= 50 )

# FLANN匹配器
flann = cv2.FlannBasedMatcher(indexParams, searchParams)

# K-最近邻匹配
matches = flann.knnMatch(des1, des2, k= 2 )

# 绘制一个空白图片
matchesMask = [[ 0 , 0 ] for i in range(len(matches))]

# 绘制图像
for i, (m, n) in enumerate(matches):
if m.distance < 0.7 *n.distance:
matchesMask[i] = [ 1 , 0 ]
good.append(m)


# 图像参数
drawParams = dict(matchColor=( 0 , 255 , 0 ),
singlePointColor=( 255 , 0 , 0 ),
matchesMask=matchesMask,
flags= 0 )

# 最终结果
resultImage = cv2.drawMatchesKnn(queryImage, kp1, trainingImage, kp2, matches, None , **drawParams)

# 检测是否匹配
if len(good) > 10 :
print( 'It is a match!' )

# 设置显示窗口
cv2.namedWindow( 'img' , 0 )
cv2.resizeWindow( 'img' , 840 , 480 )
cv2.imshow( 'img' , resultImage)
while True :
if cv2.waitKey( 0 ) & 0xff == ord( 'q' ):
break
cv2.destroyAllWindows()

输出下图。

可以看到原始图片上的logo和目标图片上的logo匹配上了。

也就意味着,我们能够利用原始图片(微博logo)从一个包含目标图片的图片库里检索到目标图片(包含微博logo)。

以图搜图,这还是很相似的。

当然,我并不知道以图搜图到底是通过何种办法实现的。

毕竟弱鸡~

/ 03 / 总结

最开头放的视频是今年过年时的一部电影——疯狂的外星人。

记得当时还是和一个好友一起去看的,认识十几年了,还一直保持联系。

算是为数不多我一直联系的朋友了。

正值高考来临,难免感慨一番,毕竟有些朋友真的是走着走着就散了。