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

不同相机之间图片像素对应关系求解(单应性矩阵求解)

一、场景

        相机1和相机2相对位置不变,相机拍摄图片有重叠,求他们交叠部分的一一对应关系。数学语言描述为已知相机1图片中P点像素(u1, v1),相机1中P点在相机2图片中像素值为(u2, v2),它们存在某种变换,求变换矩阵。

        因为涉及的场景比较简单,目前没有涉及深度,同时采集的目标近似平面,所以可以简化场景,采用单应性矩阵求解。所以上述所涉及的变换矩阵假设为单应性矩阵H(3*3矩阵),它们满足如下关系。

         这样的话,简单很多(如果场景复杂,涉及了深度或者采集对象不是平面,可以使用本质矩阵/基础矩阵的方法获取这个变换矩阵),只需借助标准标定板计算得到H。

二、单应性矩阵

        定义:用 [理想成像] 的相机从不同位置拍摄 [同一平面物体] 的图像之间存在单应性,可以用 [透视变换] 表示 。有以下公式:

         接下来就是求解H矩阵,上述公式展开如下:

         由平面坐标与齐次坐标对应关系,上式可以表示为:

         进一步,

        写成AX=0形式,如下。这种形式求解方式很多,前面的博客也有所涉及。不过需要特别指出的是,虽然H矩阵有9个未知数,但是只有8个自由度(平面关系),其中h33=1。所以求解方程只需要4个不共线点即可求解。

 

三、实际效果

3.1 全部代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
import numpy as npdef OnMouseAction(event, x, y, flags, param):"""鼠标的回调函数,处理鼠标事件:param event::param x::param y::param flags::param param::return:"""if event == cv2.EVENT_LBUTTONDOWN:global gimg_x, gimg_y, gis_okgimg_x = xgimg_y = ygis_ok = Trueelif event == cv2.EVENT_RBUTTONDOWN:print("右键点击")elif flags == cv2.EVENT_FLAG_LBUTTON:print("左鍵拖曳")elif event == cv2.EVENT_MBUTTONDOWN:print("中键点击")def verification(img1, img2, H):def nothing(x):passcv2.namedWindow('image1')cv2.setMouseCallback('image1', OnMouseAction)# create trackbars for color changecv2.createTrackbar('thr', 'image1', 121, 255, nothing)cv2.createTrackbar('Shading', 'image1', 255, 255, nothing)count = 0while True:cv2.imshow("image1", img1)cv2.imshow("image2", img2)k = cv2.waitKey(1) & 0xFF# 通过关闭窗口的右上角关闭if cv2.getWindowProperty('image1', cv2.WND_PROP_AUTOSIZE) < 1:break# 通过按键盘的ESC退出if k == 27:breakglobal gimg_x, gimg_y, gis_okif gis_ok:count += 1cv2.circle(img1, (gimg_x, gimg_y), 3, (0, 0, 255), -1)cv2.putText(img1, str(count), (gimg_x, gimg_y), 2, 1, (0, 0, 255))gis_ok = False(x, y, z) = np.matmul(H, np.array([gimg_x, gimg_y, 1]).T)cv2.circle(img2, (int(x / z), int(y / z)), 2, (0, 0, 255), -1)cv2.putText(img2, str(count), (int(x / z), int(y / z)), 2, 1, (0, 0, 255))def getHomography(img1, img2):gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)ret, corners1_1 = cv2.findChessboardCorners(gray1, (gcols, grows), None)if not ret:return ret, None# sub-pixel corner detectioncorners1_2 = cv2.cornerSubPix(gray1, corners1_1, (11, 11), (-1, -1), criteria)ret, corners2_1 = cv2.findChessboardCorners(gray2, (gcols, grows), None)if not ret:return ret, None# sub-pixel corner detectioncorners2_2 = cv2.cornerSubPix(gray2, corners2_1, (11, 11), (-1, -1), criteria)H, mask = cv2.findHomography(corners1_2, corners2_2, cv2.RANSAC)return True, Hgimg1Root = "./image_homography/1080p_1.png"
gimg2Root = "./image_homography/1080p_2.png"
gimg3Root = "./image_homography/720p_3.png"
(grows, gcols) = (8, 11)
def main():img1 = cv2.imread(gimg1Root)img2 = cv2.imread(gimg3Root)is_ok, H = getHomography(img1, img2)print(H)verification(img1, img2, H)global gimg_x, gimg_y, gis_ok
gimg_x = 0
gimg_y = 0
gis_ok = False
if __name__ == "__main__":main()

3.2 实际效果

 

相关文章:

不同相机之间图片像素对应关系求解(单应性矩阵求解)

一、场景 相机1和相机2相对位置不变&#xff0c;相机拍摄图片有重叠&#xff0c;求他们交叠部分的一一对应关系。数学语言描述为已知相机1图片中P点像素(u1, v1)&#xff0c;相机1中P点在相机2图片中像素值为(u2, v2)&#xff0c;它们存在某种变换&#xff0c;求变换矩阵。 因为…...

远程管理时代,还得是智能化PDU才靠得住!

在如今这个信息技术高速发展的时代&#xff0c;数据中心IDC机房服务器数量与日俱增&#xff0c;提供DNS域名服务、主机托管服务、虚拟主机服务等服务的服务器是IDC最基本的功能之一。服务器需要7*24小时不间断持续工作&#xff0c;但当服务器数量很大&#xff0c;服务器工作、重…...

通俗易懂理解——布隆过滤器

文章目录概述本质优缺点优点&#xff1a;缺点&#xff1a;实际应用解决redis缓存穿透问题&#xff1a;概述 本质 本质&#xff1a;很长的二进制向量&#xff08;数组&#xff09; 主要作用&#xff1a;判断一个数据在这个数组中是否存在&#xff0c;如果不存在为0&#xff0c…...

TypeScript 学习之类型推导

在一些情况下&#xff0c;代码上没有显性明确类型&#xff0c;typescript 可以隐形推断出类型。 基础 let x 3;变量x的类型被推断为数字。 类型推断发生在初始化变量和成员&#xff0c;设置默认参数值和决定函数返回值时 最佳通用类型 let x [0, 1, null]; // 类型为 numb…...

Android四大组件——Service详解

Service 为后台运行&#xff0c;不可见&#xff0c;没有界面。优先级高于Activity&#xff08;内存不足时先杀掉Activity&#xff09;&#xff0c;运行在主线程且不能做耗时操作。 一、Service 启动方式 1、startService() 通过 startService 启动后&#xff0c;service会一直…...

svg转png

svg转png写了一个spring boot项目&#xff0c;支持传入svg文件转出png图片&#xff0c;并且自定义转出png的宽和高。主要代码如下&#xff1a;所需依赖如下&#xff1a;演示如下&#xff1a;首先&#xff0c;运行项目使用接口调用工具调用接口发送请求&#xff0c;提取文件1000…...

教你如何搭建人事OA-员工管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建人事OA-员工管理。1.2、应用场景人事OA-员工管理应用对员工信息进行管理&#xff0c;可办理入职、转正、离职等流程。2、设置方法2.1、表单搭建1&#xff09;新建表单【员工管理】&#xff0c;字段设置如下&#xff1a;名称…...

C++递推基础知识

文章目录一、递推的概念二、递推和递归的区别三、递推的实例1、最基础的&#xff1a;斐波那契数列2、变形版斐波那契数列3、较复杂的递推式求解&#xff1a;昆虫繁殖4、经典逆推问题&#xff1a;题目数量一、递推的概念 1、什么是递推算法&#xff1f; 递推算法&#xff1a;是…...

【Python入门第十天】Python 布尔

布尔表示两值之一&#xff1a;True 或 False。 布尔值 在编程中&#xff0c;通常需要知道表达式是 True 还是 False。 可以计算 Python 中的任何表达式&#xff0c;并获得两个答案之一&#xff0c;即 True 或 False。 比较两个值时&#xff0c;将对表达式求值&#xff0c;P…...

WebDAV之π-Disk派盘+Piktures

Piktures支持WebDAV方式连接π-Disk派盘。推荐一款简单易用&#xff0c;功能超级强大的智能相册应用。Piktures智能相册是一款简单易用&#xff0c;功能超级强大的智能相册应用&#xff0c;它不仅可以访问本地和云照片&#xff0c;还可以照片编辑器&#xff0c;而且它同时还是一…...

Revit问题:Navisworks中导入的rvt模型角度不正确调整

一、Navisworks中导入的rvt模型角度不正确调整方法 通常情况下&#xff0c;我们做好一个Revit模型&#xff0c;有时候出于成果保护或者鉴于Revit自带的碰撞检测效果不够直观、Revit模型体量太大&#xff0c;需要一个轻量化的模型展示&#xff0c;我们通常情况下会使用Autodesk公…...

最全正则验证

一、校验数字的表达式 1. 数字&#xff1a;^[0-9]*$ 2. n位的数字&#xff1a;^\d{n}$ 3. 至少n位的数字&#xff1a;^\d{n,}$ 4. m-n位的数字&#xff1a;^\d{m,n}$ 5. 零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$ 6. 非零开头的最多带两位小数的数字&#xff1a;…...

阿里云服务器入门使用流程 新手学习教程

一、阿里云根据个人需要选合适的云服务器&#xff0c;选好cpu、内存、带宽&#xff0c;地域&#xff0c;这四个是主要的。其他可以默认选择。 二、登陆控制台 输入账号密码&#xff0c;进去看到服务界面&#xff0c;新手可能不容易看懂。点击左侧菜单&#xff0c;点击云服务器…...

git学习

一.实际场景 数据备份代码还原协同开发追溯问题代码的编写人和编写时间 二.Git工作流程图 三.获取本地仓库 四.git add和git commit git status&#xff1a;查看修改的状态&#xff08;暂存区&#xff0c;工作区&#xff09; git add . &#xff1a;通配符&#xff0c;添加当…...

新建一个完整的react项目和完善初始项目

一&#xff1a;新建一个完整的react项目 1.环境准备 目前我的环境是 node&#xff1a;16.17.1 npm&#xff1a; 8.15.0 查看环境&#xff1a;1)&#xff1a;打开命令提示符工具&#xff0c;利用node -v和npm -v 查看一下自己的环境&#xff0c;如果觉得重新卸载、安装node比较…...

HIVE 安装

目录 启动hadoop 把hive压缩包拷贝到虚拟机里面 解压 改名 配置环境变量 新建一个hive-site.xml文件&#xff0c;并编辑 配置文件 添加jar包 初始化mysql 启动hive 创建数据库 使用数据库 创建表 添加数据 查看数据 删除表 安装虚拟机 安装JDK 安装Hadoop …...

jsp游泳馆门票管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp游泳馆门票管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;…...

C++ ---智能指针详解

文章目录前言一、 为什么需要智能指针&#xff1f;二、内存泄漏2.1 什么是内存泄露?危害是什么?2.2 内存泄露的分类2.3 如何避免内存泄露三、智能指针的使用及原理3.1 RAII3.2 智能指针的原理3.3 std::autoptr3.4 std::unique_ptr3.5 std::shared_ptrstd::shared_ptr的循环引…...

企业带宽控制管理

在企业中保持稳定的网络性能可能具有挑战性&#xff0c;因为采用数字化的网络可扩展性和敏捷性应该与组织的发展同步。随着基础设施的扩展、新应用和新技术的引入&#xff0c;网络的带宽容量也在增加。 停机和带宽过度使用是任何组织都无法避免的两个问题&#xff0c;为了解决…...

MybatisPlus实现分页效果并解决错误:cant found IPage for args!

前言 早就知道MybatisPlus对分页进行了处理&#xff0c;但是一直没有实战用过&#xff0c;用的是自己封装的一个分页组件&#xff0c;虽不说麻烦吧&#xff0c;但是也不是特别简单。 写起来还是比较复杂&#xff0c;但是最近这个组件有了点小小的bug&#xff0c;我决定是时候…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...