• 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.pswp.cn/bicheng/93404.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93404.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93404.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 安装带证书的 etcd 集群

1.概念 etcd 是由GO语言编写的分布式的、可靠的键值存储系统&#xff0c;主要用于分布式系统中关键数据的存储和服务发现。 2.核心概念 节点&#xff08;Node&#xff09; 每个运行 etcd 的实例被称为一个节点。一个或多个节点可以组成一个集群。 集群&#xff08;Cluster&…

360 集团20周年会:战略升级ALL IN Agent,抢占智能体时代先机

发布 | 大力财经8月15日&#xff0c;360集团迎来二十周年&#xff0c;在北京奥林匹克体育中心举办的“360集团20周年荣耀庆典”上&#xff0c;创始人周鸿祎向现场数千名员工发表演讲&#xff0c;回顾360集团二十年的发展历程&#xff0c;并明确360集团下一阶段的公司战略&#…

命令模式C++

命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装为一个对象&#xff0c;使你可以用不同的请求对客户进行参数化&#xff0c;还能支持请求的排队、记录日志及撤销操作。这种模式将发送者和接收者解耦&#xff0c;发送者无需知道接…

Web攻防-大模型应用LLM搭建接入第三方内容喂养AI插件安全WiKI库技术赋能

知识点&#xff1a; 1、WEB攻防-LLM搭建-AI喂养&安全知识WIKI库 演示案例&#xff1a;WEB攻防-LLM搭建-AI喂养&安全知识WIKI库 使用参考 https://docs.web2gpt.ai/ https://mp.weixin.qq.com/s/qqTOW5Kg1v0uxdSpbfriaA 0、服务器环境&#xff1a;阿里云 Ubuntu22.04 …

图片拼接-动手学计算机视觉8

前言图片拼接&#xff08;image stitching&#xff09;就是将统一场景的不同拍摄出的图片拼接到一起&#xff0c;如图所示就是拼接全景图&#xff0c;是图片拼接的应用之一&#xff0c;手机拍照都有全景拍摄功能仔细观察全景图&#xff0c;寻找它们相似性&#xff0c;图8-2的全…

Web第二次作业

作业一&#xff1a;学校官网1.1学校官网代码如下&#xff1a;​<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

【CV 目标检测】②R-CNN模型

二、R-CNN网络基础 2.R-CNN模型 2014年提出R-CNN&#xff01;网络&#xff0c;该网络不再使用暴力穷举的方法&#xff0c;而是使用候选区域方法&#xff08;region proposal method&#xff09;创建目标检测的区域来完成目标检测的任务&#xff0c;R-CNN是以深度神经网络为基础…

STM32L051C8与STM32L151C8的主要区别

STM32L051C8与STM32L151C8 有什么区别&#xff1f; LPTIM 有什么特点,为什么STM32L151C8没有LPTIM,而STM32L051C8有1个? 1. STM32L051C8与STM32L151C8的主要区别 STM32L051C8STM32L151C8内核Cortex-M0Cortex-M3主频32MHz32MHz闪存/ SRAM64KB/8KB64KB/16KB工作电压1.65V-3.6V…

【软考中级网络工程师】知识点之网关协议深度剖析

目录一、网关协议基础探秘1.1 网关协议概念1.2 网关协议作用1.3 网关协议分类总览二、内部网关协议&#xff08;IGP&#xff09;深度解析2.1 距离矢量协议2.2 链路状态协议2.3 混合型协议三、外部网关协议&#xff08;EGP&#xff09;探秘3.1 BGP 协议详解3.2 BGP 协议的关键特…

JavaScript 中 call、apply 和 bind 方法的区别与使用

一、核心作用与基础概念这三个方法都用于显式改变函数执行时的 this 指向&#xff0c;解决 JavaScript 中函数上下文动态绑定的问题。1.call()立即执行函数&#xff0c;第一个参数为 this 指向对象&#xff0c;后续参数为逗号分隔的参数列表语法&#xff1a;func.call(thisArg,…

【Android】适配器与外部事件的交互

三三要成为安卓糕手 引入&#xff1a;在上一篇文章中我们完成了新闻展示页面多布局案例的展示&#xff0c;感悟颇多&#xff0c;本篇文章&#xff0c;继续去开发一些新的功能 一&#xff1a;关闭广告 所有的view都可以和我们的用户做交互&#xff0c;循环视图中也给我们提供了相…

MySQL的分析查询语句(EXPLAIN):

目录 基本语法&#xff1a; 各个字段的含义&#xff1a; id&#xff1a; select_type&#xff1a; table&#xff1a; partitions&#xff1a; type&#xff1a; possible_keys&#xff1a; key&#xff1a; key_len&#xff1a; ref&#xff1a; row&#xff1a; …

C++ #if

在 C 中&#xff0c;#if 是 预处理器指令&#xff08;Preprocessor Directive&#xff09;&#xff0c;用于 条件编译&#xff0c;即在编译阶段根据条件决定是否包含某段代码。它通常与 #define、#ifdef、#ifndef、#else 和 #endif 配合使用。基本语法#if 条件表达式// 如果条件…

方案 | 动车底部零部件检测实时流水线检测算法改进

项目背景随着我国高速铁路运营里程突破4.5万公里&#xff0c;动车组日均开行超过8000列次&#xff0c;传统人工巡检方式已无法满足密集运行下的安全检测需求。车底关键部件如制动系统、悬挂装置、牵引电机等长期承受高强度振动和冲击&#xff0c;易产生疲劳裂纹、螺栓松动、部件…

企业收款统计:驱动业务决策的核心引擎设计开发——仙盟创梦IDE

代码完整代码<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>黑金风格职员统计</title><style>/* 页面基础样式 - 黑金风格 */body {font-family: Segoe UI, Tahoma, Geneva, Verdana, …

CIAIE 2025上海汽车内外饰展观察:从美学到功能的产业跃迁

在智能化、电动化浪潮推动下&#xff0c;汽车产业的市场格局、技术路线、供应链结构与用户体验正被系统性重塑。汽车感知空间核心的“内外饰件”&#xff0c;正从原本的结构性、功能性部件&#xff0c;逐步跃升为智能化、情感化和差异化体验的重要承载载体&#xff0c;开启了从…

Spring IOC容器在Web环境中的启动奥秘:深入源码解析

一、为何需要关注IOC容器启动&#xff1f;在Java Web开发中&#xff0c;Spring MVC框架的基石正是IOC容器。但你是否思考过&#xff1a;独立的IOC模块如何与Tomcat等Servlet容器协同工作&#xff1f; 其启动过程与Web容器的生命周期深度绑定&#xff0c;这是构建稳定Spring应用…

前端JS处理时间,适用于聊天、操作记录等(包含刚刚、x分钟前、x小时前、x天前)

export default {// 首页时间转化formatDate(val) {var nowDate new Date()var oldDate new Date(val)const Y oldDate.getFullYear()const M oldDate.getMonth() 1const D oldDate.getDate()var diff nowDate.getTime() - oldDate.getTime()var minutes Math.floor(di…

C#---StopWatch类

老方法&#xff0c;想要全面了解和学习一个类必先看文档 微软文档 1.StopWatch 提供一组方法和属性&#xff0c;可用来测量运行时间。 1.1 属性和方法 属性&#xff1a; 方法&#xff1a; 1.2 使用 using System.Diagnostics;namespace Study04_反射专题 {internal cla…

3DTiles转OSGB格式逆向转换方法研究

一、概述 在倾斜摄影的应用领域中&#xff0c;3DTiles与OSGB格式的互转是常见的技术需求。作为专业的GIS处理平台&#xff0c;GISBox凭借其先进的倾斜摄影反切功能&#xff0c;为用户提供了高效、稳定的跨格式数据转换解决方案。 二、3DTiles转OSGB的意义 保留原始几何与纹理…