python opencv3 FLANN单应性匹配
2024-10-08 03:31:13
git:https://github.com/linyi0604/Computer-Vision
匹配准确率非常高。
单应性指的是图像在投影发生了 畸变后仍然能够有较高的检测和匹配准确率
# coding:utf-8 """
单应性匹配:
两幅图像中的一幅 出现投影畸变的时候,他们还能彼此匹配
""" import cv2
import numpy as np
# 最小匹配数量设为10个, 大于这个数量从中筛选出10个最好的
MIN_MATCH_COUNT = 10 # 读入两幅图片 图片中有相同部分
img1 = cv2.imread("../data/logo1.png", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("../data/album1.png", cv2.IMREAD_GRAYSCALE) # 获取sift特征检测器
sift = cv2.xfeatures2d.SIFT_create()
# 检测关键点 计算描述符
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None) # kdtree建立索引方式的常量参数
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50) # checks指定索引树要被遍历的次数
flann = cv2.FlannBasedMatcher(index_params, search_params)
# 进行匹配搜索
matches = flann.knnMatch(des1, des2, k=2) # 寻找距离近的放入good列表
good = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
good.append(m) # 如果足够多 就筛选
if len(good) > MIN_MATCH_COUNT:
# 通过距离近的描述符 找到两幅图片的关键点
src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) # 单应性匹配图关键点匹配线。。不懂啥意思
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
matchesMask = mask.ravel().tolist() h, w = img1.shape # 计算第二张图相对于第一张图的畸变
pts = np.float32([[0, 0], [0, h-1], [w-1, 0]]).reshape(-1, 1, 2)
dst = cv2.perspectiveTransform(pts, M)
img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
else:
matchesMask = None draw_params = dict(
matchColor=(0, 255, 0),
singlePointColor=None,
matchesMask=matchesMask,
flags=2
) img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
cv2.imshow("", img3)
cv2.waitKey()
最新文章
- Jquery对网页高度、宽度的操作
- python 数据类型---列表使用之三
- Normalize.css的使用及下载
- gradle相关配置内容解析
- (二十一)状态模式详解(DOTA版)
- 3ds max删除了对象后,还是将原来所有对象输出的原因
- Codeforces Round #264 (Div. 2)
- purple-accessData
- 【BZOJ】【1492】【NOI207】货币兑换Cash
- mongodb使用中遇到的问题汇总
- maxlength属性在textarea里奇怪的表现
- OpenWrt固件刷入后串口终端没有反应的问题
- AFNetworking 系列教程
- 集合运算符之全集、交集、补集【weber出品必属精品】
- use EXPORT和use EXPORT_OK
- isPostBack原理
- Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)
- Python学习笔记(八)
- cocos creator 碰撞检测
- [java]static关键字的四种用法
热门文章
- Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again错误解决
- jQuery基础之二(操作标签)
- 25、LinkedList特有方法
- sparse coding
- Spring4笔记5--基于注解的DI(依赖注入)
- C# 链接webservice报错
- Python 正则表达式提高
- java基础78 Servlet的生命周期
- java基础64 JavaScript中的Arrays数组对象和prototype原型属性(网页知识)
- ThinkPHP小知识点