【OpenCV】 ⚠️高手勿入! 半小时学会基本操作 25⚠️ 图像匹配

举报
我是小白呀iamarookie 发表于 2021/09/09 22:12:02 2021/09/09
【摘要】 【OpenCV】 ⚠️高手勿入! 半小时学会基本操作 25⚠️ 图像匹配 概述图像特征匹配match vs knnMatchBrute-Force 匹配器FLANN 匹配器 概述 Op...

【OpenCV】 ⚠️高手勿入! 半小时学会基本操作 25⚠️ 图像匹配

概述

OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天带大家用 OpenCV 来实现一个简单的磨皮. (第 25 课)

在这里插入图片描述

图像特征匹配

我们在上一节课中提到了如何通过 SIFT 算法来帮助我们寻找特征点. 下面来简单讲一下特征匹配中的两个匹配器.

在这里插入图片描述

match vs knnMatch

match 格式:

match = bf.match(des1, des2)

  
 
  • 1

返回值:

  • querlyIdx: 测试图像的特征点的 index
  • trainIdx: 测试图像的特征点的 index
  • distance: 匹配特征点的欧式距离, 数值越小越接近

knnMatch 格式:

match = bf.knnMatch(des1, des2, k)

  
 
  • 1

返回值:

  • m: 最近的匹配特征点
  • n: 第二近的匹配点, 如果 m 和 n 的距离足够大, 那么这就是一个正确的匹配

Brute-Force 匹配器

Brute-Force 匹配器 (蛮力匹配器) 通过取第一个集合里一个特征的描述, 并对第二个集合里的所有特征进行匹配.

格式:

cv2.BFMatcher(crossCheck)

  
 
  • 1

参数:

  • crossCheck: 是否要求互相匹配, 即 A 中的第 i 个特征和 B 中的第 j 个特征距离最近, 并且 B 中的第 j 个特征和 A 中的第 i 个特征也是距离最近

例子:

import numpy as np
import cv2

# 读取图片
image1 = cv2.imread("dollar1.jpg")
image2 = cv2.imread("dollar4.jpg")

# 实例化SIFT
sift = cv2.SIFT_create()

# 得到特征点
kp1, des1 = sift.detectAndCompute(image1, None)
kp2, des2 = sift.detectAndCompute(image2, None)

# 实例化Brute-Force匹配器
bf1 = cv2.BFMatcher(crossCheck=True)

# 匹配
match1 = bf1.match(des1, des2)

# 按距离从小到大排序
match1 = sorted(match1, key=lambda x: x.distance)

# 绘制特征匹配
image_match1 = cv2.drawMatches(image1, kp1, image2, kp2, match1[:10], None, flags=2)

# 展示特征匹配
cv2.imshow("match1", image_match1)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 实例化Brute-Force匹配器
bf2 = cv2.BFMatcher()

# 匹配
match2 = bf2.knnMatch(des1, des2, k=2)

# 最近点和次近点阈值 (比值小于0.75)
array = np.array([[x] for x, y in match2])[[m.distance < 0.75 * n.distance for m, n in match2]]

# 绘制特征匹配
image_match2 = cv2.drawMatchesKnn(image1, kp1, image2, kp2, array, None, flags=2)

# 展示特征匹配
cv2.imshow("match2", image_match2)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 保存图片
cv2.imwrite("match1.jpg", image_match1)
cv2.imwrite("match2.jpg", image_match2)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

输出结果:

在这里插入图片描述
在这里插入图片描述

FLANN 匹配器

FLANN (Fast Library for Approximate Nearest Neighbors) 匹配器针对大型数据集中的快速最近邻搜索 & 高维特征进行了优化. 相较于 BF 匹配器更准确快速和方便.

例子:

import numpy as np
import cv2

# 读取图片
image1 = cv2.imread("dollar1.jpg")
image2 = cv2.imread("dollar4.jpg")

# 实例化SIFT
sift = cv2.SIFT_create()

# 得到特征点
kp1, des1 = sift.detectAndCompute(image1, None)
kp2, des2 = sift.detectAndCompute(image2, None)

# Flann参数
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)

# 实例化Flann匹配器
flann = cv2.FlannBasedMatcher(index_params, search_params)

# 匹配
match2 = flann.knnMatch(des1, des2, k=2)

# 最近点和次近点阈值 (比值小于0.5)
array = np.array([[x] for x, y in match2])[[m.distance < 0.5 * n.distance for m, n in match2]]

# 绘制特征匹配
image_flann = cv2.drawMatchesKnn(image1, kp1, image2, kp2, array, None, flags=2)

# 展示特征匹配
cv2.imshow("flann", image_flann)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 保存图片
cv2.imwrite("flann.jpg", image_flann)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

输出结果:

在这里插入图片描述

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/120091681

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。