当前位置: 首页 > news >正文

OpenCV Python——图像查找(特征匹配 + 单应性矩阵)

  • 1 图像查找(单应性矩阵)
  • 2 单应性矩阵 应用举例
  • 3 单应性矩阵 代码示例

P87 11

1 图像查找(单应性矩阵)

特征匹配作为输入,获得单应性矩阵
在这里插入图片描述

X在img1和img2中的成像分别为x,x'

图中H即为单应性矩阵
在这里插入图片描述

2 单应性矩阵 应用举例

获取一个矩阵,通过与图像1就算可以得到图像2对应点的位置;
图像二通过计算可以得到点原始位置,同样图像一也可以经过计算得到点原始位置;

自动转正

在这里插入图片描述
更换广告牌中的内容
在这里插入图片描述

3 单应性矩阵 代码示例

在一节FLANN特征匹配的基础上增加了,单应性矩阵、透视变换、框图

#获取的单应性矩阵
#srcPts从匹配点good中获取,每次遍历都可以从kp1[m.queryIdx]中获取一个关键点
#关键点需要转成浮点型
#对获取到的关键点要重新变换reshape(-1, 1, 2),x值随意,y值1,z值2,即无数行,每行一个元素,每个元素有2个子元素
#queryIdx,trainIdx分别是第一幅图,第二幅图的描述子索引值
if len(good) >= 4:#单应性矩阵要求匹配点要大于等于4srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)#原关键点dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)#目标关键点#单应性矩阵H, mask = cv2.findHomography(srcPts, dstPts, cv2.RANSAC, 5.0)#cv2.RANSAC对错误匹配点过滤,阈值1~10,这里是5#透视变换#获取要搜索的图的四个角点(左上,左下,右下,右上),同样需要转成浮点型,然后reshapeh, w = img1.shape[:2]pts = np.float32([[0,0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)dst = cv2.perspectiveTransform(pts, H)#多边形绘制,将找到的子图在原图中框出来吧cv2.polylines(img2, [np.int32(dst)], True, (0, 0, 255))#目标图,32位整形,TRUE封口,
else:print('the number of good is less than 4.')exit()

效果如下:

在这里插入图片描述

完整代码

import cv2
import numpy as np#读文件
img1 = cv2.imread('opencv_search.png')
img2 = cv2.imread('opencv_orig.png')#灰度化
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)#创建sift对象                                                       
sift= cv2.xfeatures2d.SIFT_create()#进行检测关键点,同时计算描述子
kp1 ,des1= sift.detectAndCompute(gray1, None)#掩码设置为NONE,即对整张图检测
kp2 ,des2= sift.detectAndCompute(gray2, None)#掩码设置为NONE,即对整张图检测#创建flann匹配器
index_params=dict(algorithm=1,tree=5)
search_params=dict(checks=50)flann=cv2.FlannBasedMatcher(index_params,search_params)#对描述子进行特征匹配
matches=flann.knnMatch(des1,des2,k=2)#对匹配点优化过滤
good=[]
for i,(m,n) in enumerate(matches):#对img1,img2中的匹配点进行遍历if m.distance < 0.7* n.distance:#越小越精准good.append(m)#获取的单应性矩阵
#srcPts从匹配点good中获取,每次遍历都可以从kp1[m.queryIdx]中获取一个关键点
#关键点需要转成浮点型
#对获取到的关键点要重新变换reshape(-1, 1, 2),x值随意,y值1,z值2,即无数行,每行一个元素,每个元素有2个子元素
#queryIdx,trainIdx分别是第一幅图,第二幅图的描述子索引值
if len(good) >= 4:#单应性矩阵要求匹配点要大于等于4srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)#原关键点dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)#目标关键点#单应性矩阵H, mask = cv2.findHomography(srcPts, dstPts, cv2.RANSAC, 5.0)#cv2.RANSAC对错误匹配点过滤,阈值1~10,这里是5#透视变换#获取要搜索的图的四个角点(左上,左下,右下,右上),同样需要转成浮点型,然后reshapeh, w = img1.shape[:2]pts = np.float32([[0,0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)dst = cv2.perspectiveTransform(pts, H)#多边形绘制,将找到的子图在原图中框出来吧cv2.polylines(img2, [np.int32(dst)], True, (0, 0, 255))#目标图,32位整形,TRUE封口,
else:print('the number of good is less than 4.')exit()#绘制匹配结果
img3=cv2.drawMatchesKnn(img1,kp1,img2,kp2,[good],None)cv2.imshow('img3', img3)
cv2.waitKey(0)
http://www.dtcms.com/a/333740.html

相关文章:

  • Linux软件编程(五)(exec 函数族、system、线程)
  • SQL:生成日期序列(填补缺失的日期)
  • 磁悬浮轴承“幽灵振动”克星:深度解析同频振动机理与精准打击策略
  • 优先级反转问题
  • [Python 基础课程]根据描述定义一个 Person 类
  • 关注与优化:用于骨龄评估的交互式关键点定位与颈椎定量分析|文献速递-深度学习人工智能医疗图像
  • Go语言中的指针接收者
  • 语音活动检测VAD技术简介
  • 崩溃大陆2 送修改器 PC/手机双端(Crashlands2)免安装中文版
  • Fanuc机器人EtherCAT通讯配置详解
  • 思科应用中心基础设施(ACI)设计指南
  • Redis面试精讲 Day 22:Redis布隆过滤器应用场景
  • 第2篇_Go语言基础语法_变量常量与数据类型
  • Java-JVM是什么JVM的类加载机制
  • 设备 AI 知识库,管理效率新飞跃
  • 安装openmmlab时出错
  • 码上爬第七题【协程+对抗格式化检测+数组移位】
  • Linux搭建ftp服务器
  • 事务的四大特性
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘fairseq’问题
  • ubuntu安装docker
  • Python爬取推特(X)的各种数据
  • Higress AI网关
  • 新手入门 Makefile:FPGA 项目实战教程(三)
  • Android - 动态切换桌面图标
  • Rubber Band Optimation算法python实现
  • linux-----------------锁
  • [Chat-LangChain] 会话图(LangGraph) | 大语言模型(LLM)
  • 第二十四天:虚函数与纯虚函数
  • 速卖通平台关键字搜索商品列表列表接口实现指南:从接口分析到代码落地