OpenCV相机标定与3D重建(37)计算两幅图像之间单应性矩阵(Homography Matrix)的函数findHomography()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
找到两个平面之间的透视变换。
cv::findHomography 是 OpenCV 库中用于计算两幅图像之间单应性矩阵(Homography Matrix)的函数。单应性矩阵描述了两个平面之间的投影变换关系,它在计算机视觉中用于图像校正、拼接和增强现实等任务。
函数原型
Mat cv::findHomography
(InputArray srcPoints,InputArray dstPoints,int method = 0,double ransacReprojThreshold = 3,OutputArray mask = noArray(),const int maxIters = 2000,const double confidence = 0.995
)
参数
- 参数srcPoints:原平面中点的坐标,可以是类型为 CV_32FC2 的矩阵或 vector。
- 参数dstPoints:目标平面中点的坐标,可以是类型为 CV_32FC2 的矩阵或 vector。
- 参数method:用于计算单应性矩阵的方法。可能的方法包括:
- 0:常规方法,使用所有点,即最小二乘法。
- RANSAC:基于RANSAC的稳健方法。
- LMEDS:最小中值(Least-Median)稳健方法。
- RHO:基于PROSAC的稳健方法。
- ransacReprojThreshold:仅用于 RANSAC 和 RHO 方法。这是允许的最大重投影误差,用于将一对点视为内点。也就是说,如果
∥ dstPoints i − convertPointsHomogeneous ( H ⋅ srcPoints i ) ∥ 2 > ransacReprojThreshold \| \texttt{dstPoints} _i - \texttt{convertPointsHomogeneous} ( \texttt{H} \cdot \texttt{srcPoints} _i) \|_2 > \texttt{ransacReprojThreshold} ∥dstPointsi−convertPointsHomogeneous(H⋅srcPointsi)∥2>ransacReprojThreshold
则认为点 i 是离群点。如果 srcPoints 和 dstPoints 以像素为单位测量,则通常将此参数设置在1到10之间是有意义的。 - 参数mask:由稳健方法(如 RANSAC 或 LMEDS)设置的可选输出掩码。注意输入掩码值被忽略。
- 参数maxIters:RANSAC的最大迭代次数。
- 参数confidence:置信水平,介于0和1之间。
该函数找到并返回源平面和目标平面之间的透视变换矩阵 H H H
s i [ x i ′ y i ′ 1 ] ∼ H [ x i y i 1 ] s_i \begin{bmatrix} x'_i \\ y'_i \\ 1 \end{bmatrix} \sim H \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix} si xi′yi′1 ∼H xiyi1
从而最小化反投影误差:
∑ i ( x i ′ − ( h 11 x i + h 12 y i + h 13 ) h 31 x i + h 32 y i + h 33 ) 2 + ( y i ′ − ( h 21 x i + h 22 y i + h 23 ) h 31 x i + h 32 y i + h 33 ) 2 \sum_i \left( \frac{x'_i - (h_{11}x_i + h_{12}y_i + h_{13})}{h_{31}x_i + h_{32}y_i + h_{33}} \right)^2 + \left( \frac{y'_i - (h_{21}x_i + h_{22}y_i + h_{23})}{h_{31}x_i + h_{32}y_i + h_{33}} \right)^2 i∑(h31xi+h32yi+h33xi′−(h11xi+h12yi+h13))2+(h31xi+h32yi+h33yi′−(h21xi+h22yi+h23))2
如果 method 参数设置为默认值 0,则函数使用所有点对通过简单的最小二乘方案计算初始单应性估计。
然而,如果并非所有的点对(srcPoints_i, dstPoints_i)都符合刚性的透视变换(即存在一些离群点),这个初始估计将会较差。在这种情况下,你可以使用三种稳健方法之一。RANSAC、LMEDS 和 RHO 方法尝试许多不同的随机子集(每次四个点对,共线点对被丢弃),使用这个子集和简单的最小二乘算法估计单应性矩阵,然后计算所估计单应性的质量/优度(对于RANSAC来说是内点的数量,对于LMEDS来说是最小中值重投影误差)。最佳子集随后用于生成单应性矩阵的初始估计和内点/离群点的掩码。
无论是否使用稳健方法,计算出的单应性矩阵都会进一步优化(在稳健方法的情况下仅使用内点),以Levenberg-Marquardt方法减少重投影误差。
RANSAC 和 RHO 方法可以处理几乎任何比例的离群点,但需要一个阈值来区分内点和离群点。LMEDS 方法不需要任何阈值,但只有当内点超过50%时才能正确工作。最后,如果没有离群点且噪声较小,使用默认方法(method=0)。
该函数用于找到初始的内部和外部矩阵。单应性矩阵确定至一个尺度。因此,它被标准化以使 h 33 = 1 h_{33}=1 h33=1。需要注意的是,每当无法估计 H 矩阵时,将返回一个空矩阵。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main( int argc, char** argv )
{// 创建虚拟的匹配点数据(假设我们有4对匹配点)vector< Point2f > srcPoints = { Point2f( 56.0f, 65.0f ), Point2f( 368.0f, 52.0f ), Point2f( 28.0f, 387.0f ), Point2f( 389.0f, 390.0f ) };vector< Point2f > dstPoints = { Point2f( 0.0f, 0.0f ), Point2f( 300.0f, 0.0f ), Point2f( 0.0f, 300.0f ), Point2f( 300.0f, 300.0f ) };// 定义输出的单应性矩阵和掩码Mat homographyMatrix, mask;// 使用 RANSAC 方法计算单应性矩阵homographyMatrix = findHomography( srcPoints, dstPoints,RANSAC, // 使用RANSAC方法3.0, // 点到投影模型的最大重投影误差mask, // 输出掩码2000, // 最大迭代次数0.995 ); // 置信水平// 打印结果cout << "Homography Matrix:\n" << homographyMatrix << endl;// 打印哪些点被认为是内点cout << "Inliers mask:\n";for ( size_t i = 0; i < mask.total(); ++i ){if ( mask.at< uchar >( i ) ){cout << "Point " << i + 1 << " is an inlier." << endl;}else{cout << "Point " << i + 1 << " is an outlier." << endl;}}return 0;
}
运行结果
Homography Matrix:
[1.055873761296419, 0.09181510967794945, -65.09691276166618;0.04690100493754324, 1.125624118501043, -75.79202397907012;0.0001832514481695185, 0.0005133370013304123, 0.9999999999999999]
Inliers mask:
Point 1 is an inlier.
Point 2 is an inlier.
Point 3 is an inlier.
Point 4 is an inlier.
相关文章:
OpenCV相机标定与3D重建(37)计算两幅图像之间单应性矩阵(Homography Matrix)的函数findHomography()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 找到两个平面之间的透视变换。 cv::findHomography 是 OpenCV 库中用于计算两幅图像之间单应性矩阵(Homography Matrix)的…...
从虚拟到现实:AI与AR/VR技术如何改变体验经济?
引言:体验经济的崛起 在当今消费环境中,产品与服务早已不再是市场竞争的唯一焦点,能够提供深刻感知和独特体验的品牌,往往更能赢得消费者的青睐。这种转变标志着体验经济的崛起。体验经济不仅仅是简单的买卖行为,而是通…...
Linux系统之stat命令的基本使用
Linux系统之stat命令的基本使用 一、stat命令 介绍二、stat命令帮助2.1 查询帮助信息2.2 stat命令的帮助解释 三、stat命令的基本使用3.1 查询文件信息3.2 查看文件系统状态3.3 使用格式化输出3.4 以简洁形式打印信息 四、注意事项 一、stat命令 介绍 stat 命令用于显示文件或文…...
c++ 命名空间
目录 目录 目录 namespace的定义 代码演示 先使用全局域,再使用namespace定义出的域 命名空间中可以定义变量/函数/类型等 命名空间可以嵌套 namespace的使用 指定命名空间访问 using将命名空间中某个成员展开 展开命名空间中全部成员 在c中,由…...
【实验记录】动手实现一个简单的神经网络实验(一)
最近上了“神经网络与深度学习”这门课,有一个自己动手实现调整神经网络模型的实验感觉还挺有记录意义,可以帮我巩固之前学习到的理论知识,所以就打算记录一下。 实验大概是使用LeNet(卷积神经网络)对MINIST数据集做图…...
【2024年最新】BilibiliB站视频动态评论爬虫
废话不多说,直接先放git仓库:GitHub - linyuye/Bilibili_crawler: bilibili爬虫,基于selenium获取oid与cookie,request获取api内容 〇:概念简述 oid:视频/动态的uuid,b站对于发布内容的通用唯…...
清空DNS 缓存
如果遇到修改了host文件,但是IP和域名的映射有问题的情况,可以尝试刷新DNS缓存。 ipconfig/flushdns win建加R建,然后输入cmd,然后回车 然后回车,或者点击确定按钮。 出现如下所示标识清空DNS 缓存成功。...
东土智能交通服务器助力北京市车路云一体化建设
背景及意义 北京高级别自动驾驶示范区自2020年启动建设,至今已经发展建设到3.0阶段,通州区作为3.0阶段扩建的重点区域之一,扩区建设范围共计约175平方公里,涉及18个属地街镇,涵盖580个路口。 作为北京市车路云一体化…...
HarmonyOS NEXT 实战之元服务:静态案例效果---妙语集语
背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: import { authentication } …...
python基础项目
1.联系人案例 # 导入的模块 from input_util import * import re import csv# 定义一个变量保存文件读取的信息 users {}# 封装读取文件的函数 def reader_file(path_name: str ./python基础/2024-11-15python基础项目/data/a.csv) -> None:try:with open(path_name, enco…...
mysql返回N/A
在写统计图的接口,sql查询一直无数据,给的默认值也没有实现: SELECTifnull( unit.num, 0 ) riskUnitCount,ifnull( EVENT.num, 0 ) riskEventCount,ifnull( measure.num, 0 ) riskMeasureCount FROMtb_companyLEFT JOIN (SELECTrisk.qyid,co…...
C++---------迭代策略与迭代器
一、迭代策略与迭代器 迭代器的概念 迭代器是一种对象,它提供了一种统一的方式来访问容器(如数组、向量、列表等)中的元素,而不暴露容器的内部结构。迭代器的行为类似于指针,可以用于遍历容器中的元素、修改元素以及…...
深入解析 Oracle 的聚合函数 ROLLUP
目录 深入解析 Oracle 的聚合函数 ROLLUP一、ROLLUP 函数概述二、ROLLUP 函数语法三、ROLLUP 实例详解(一)基础分组聚合(二)引入 ROLLUP 函数(三)ROLLUP 与 NULL 值(四)多列复杂分组…...
kipotix4靶机实战
信息收集 1.判断靶机ip 原理:开靶机之前nmap扫一次网段,再开靶机之后扫一次,查看多出来的ip就是靶机ip ip192.168.98.1742.判断端口服务,系统版本 a.确定端口 b.-p指定端口进一步收集 c.信息筛选 1.端口:22,80,139,…...
Java中处理if-else的几种高级方法
前言 在我看来多写几个if-else没啥大不了的,但是就是看起来没啥逼格,领导嫌弃。我根据开发的经历写几个不同的替代方法 一、枚举法替代 我先前写了一篇文章,可以去看看。 通过枚举替换if-else语句的解决方案_枚举代替if else c语言-CSDN博…...
LaTeX 是一种基于标记的排版系统,广泛用于创建高质量的文档,特别是在需要复杂数学公式、表格、文献引用等的场景中
LaTeX 是一种基于标记的排版系统,广泛用于创建高质量的文档,特别是在需要复杂数学公式、表格、文献引用等的场景中。以下是关于 LaTeX 的详细解释: 1. LaTeX 的基本概念 本质:LaTeX 是基于 TeX 的排版系统,提供了更高…...
Go入门篇:(一)golang的安装和编辑工具安装
一、前言 最近我有幸接触到Go语言,深入了解后,发现go语言确实有很多让人惊叹的地方。作为一个有着多年Java编程经验的程序员,我深深地被它所吸引,并且决定记录下我的学习之路,以便与大家分享我的经验和感悟。 与Java不同,Go语言的语法和运行效率都非常高,特别是对于并…...
【10】Selenium+Python UI自动化测试 邮件发送测试报告(某积载系统实例-04)
测试报告需要发送给相关人员,但每次都要在report目录下去复制太麻烦,可以使用邮件模块自动将生成的报告发送给相关人员 1、 新增utils文件夹,用于存放工具文件 在utils下新增sendmail.py文件 代码 sendmail.py import smtplib from email.…...
Playwright爬虫xpath获取技巧
示例一 <button class"MuiButtonBase-root MuiButton-root MuiLoadingButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-sizeLarge MuiButton-containedSizeLarge MuiButton-colorPrimary MuiButton-fullWidth MuiButton-root MuiLoadingButton…...
运算符 - 算术、关系、逻辑运算符
引言 在编程中,运算符是用于执行特定操作的符号。C 提供了多种类型的运算符,包括算术运算符、关系运算符和逻辑运算符等。理解这些运算符及其用法对于编写高效且无误的代码至关重要。本文将详细介绍 C 中的这三种基本运算符,并通过实例帮助读…...
中关村科金外呼机器人智能沟通破解营销难题
当今,传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性,难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员,成为企业的难题。中关村科金外呼机器人通过智能化沟通技术,为企业提供了一站…...
css绘制圆并绘制圆的半径
<div class"item1"></div>.item1 {position: relative;width: 420px;height: 420px;border-radius: 50%; /* 圆形 */color: white; /* 文本颜色 */background-color: rgba(154, 227, 36, 0.4); } .item1::before {content: "";position: absol…...
实现类似gpt 打字效果
1. css的动画(animation) css中实现动画有两种方式:transition过渡动画、 animation自定义动画。 具体的可以看MDN链接:https://developer.mozilla.org/zh-CN/docs/Web/CSS/animation 使用keyframes自定义关键帧动画并未其命名使用自定义动…...
【乐企文件生成工程】根据特定要素动态选择需要生成的发票板式文件实现
乐企版式文件生成工程,涉及到多个票种,不乏特殊票种的生成,如果每个特殊票种都单独写逻辑,那整个代码写起来体量就不得了,如何实现代码逻辑的同时也更优雅的实现代码扩展性呢,您接着往下看。 使用设计模式 工厂模式 1、定义接口InvoiceFileService public interface Inv…...
near-synonym反义词生成(2):Prompt +Bert-MLM(FT)
near-synonym之反义词生成方法二 near-synonym, 中文反义词/近义词/同义词(antonym/synonym)工具包. 方法一为(neg_antonym): Word2vec -> ANN -> NLI -> Length 方法二为(mlm_antonym): Prompt Bert-MLM(FT) Beam-Search 项目地址 github: https://github.com/yon…...
dockfile 配置 /etc/apt/source.list.d/debian.list 清华镜像
docker:3.12.7 镜像使用的是 debian 系统,比 ubuntu 更轻量。debian 系统内,apt 镜像源列表位于 /etc/apt/source.list.d/debian.list(作为对比,ubuntu 的镜像列表位于 /etc/apt/source.list,二者语法相同)…...
DAY38|动态规划Part06|LeetCode:322. 零钱兑换、279.完全平方数、139.单词拆分
目录 LeetCode:322. 零钱兑换 基本思路 C代码 LeetCode:279.完全平方数 C代码 LeetCode:139.单词拆分 基本思路 C代码 LeetCode:322. 零钱兑换 力扣题目链接 文字讲解:LeetCode:322. 零钱兑换 视频讲解:动态规划之完全背包,装满背包最…...
Spring事务回滚
Transactional注解 Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。 Transactional注解:我们一般会在业务层当中来控制…...
【目标跟踪】checkpoint文件到底是什么?
说实话,我一直决定计算机视觉是个很玄的东西,里面的很多东西都是看了概念之后云里雾里,今天就把我复现代码时遇到的不懂得讲一讲——checkpoint文件是个啥? checkpoint文件顾名思义就是一个模型检查点文件,用于保存训练…...
hiprint结合vue2项目实现静默打印详细使用步骤
代码地址是:vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址:electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm(socket.…...
apt和apt-get软件包管理工具-debian
apt 和 apt-get 是在基于Debian的Linux发行版(如Ubuntu)中使用的两个软件包管理工具,它们都属于APT(Advanced Package Tool)的前端工具,用于管理软件包的安装、更新、升级和删除。以下是它们的特性和一些比…...
小程序租赁系统开发的优势与实践探索
内容概要 小程序租赁系统开发正在引起广泛关注,特别是在数字化快速发展的今天。很多企业开始意识到,小程序不仅能为他们带来更多的客户,还能极大地提高管理效率。借助小程序,用户在租赁时可以更加方便地浏览和选择产品࿰…...
sheng的学习笔记-AI-模型评估-留出法、交叉验证法、自助法
Ai目录:sheng的学习笔记-AI目录-CSDN博客 评估方法: 数据集可以分为 训练集,交叉验证集,测试集。 训练集相当于自己做作业,验证集相当于考试测试一下自己的实力,测试集就是真刀真枪的干(当你…...
【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData
当需要获知组件是否被销毁时,ECS是没有回调告知的,因此可以将组件继承于ISystemStateComponentData接口,这样即使组件的实体被销毁了,该组件本身是不会消失的,所以可以通过在组件实体销毁后,去设置状态组件…...
DVWA靶场第三关 CSRF
CSRF的中文叫:”跨站请求攻击“,它是通过仿照某一个特殊的网页(重置密码)来进行诱惑性攻击。 难度(low级) 审计代码: <?phpif( isset( $_GET[ Change ] ) ) {// Get input$pass_new $_GE…...
工作流审批功能的一些概念
1. 引言 在当今数字化时代,企业与组织的运营效率在很大程度上依赖于高效、精准的工作流审批系统。随着业务日益复杂且多样化,审批流程变得愈加细致和灵活。一个完善的工作流审批系统不仅能确保任务在组织内部有序流转、协调各方资源,还能实现…...
深度学习与图像处理(国产深度学习框架——飞桨官方指定教材)
计算机视觉从小白到大师之路 《深度学习与图像处理(PaddlePaddle版)》这一本就够了 1.引言 随着人工智能技术的飞速发展,各行各业对深度学习、图像处理相关领域的人才需求日益迫切。本书旨在通过系统的理论讲解与丰富的实战案例࿰…...
音视频入门知识(二)、图像篇
⭐二、图像篇 视频基本要素:宽、高、帧率、编码方式、码率、分辨率 其中码率的计算:码率(kbps)=文件大小(KB)*8/时间(秒),即码率和视频文件大小成正比 YUV和RGB可相互转换 ★YUV(原始数据&am…...
计算机网络——期末复习(3)4-6章考试重点
第四章 根据IPv4第1个十进制数值判断,127以下为A类,128~191为B类,192~223为C类不能分配给主机或路由器接口的:A类网络号0和127,主机号全为0或全为1私有地址(Private IP Address)是指一类专门保…...
openfeign自动将Boolean默认为false
最近发现项目服务间,通过openfeign调用API时,为null的Boolean类型,接收端反系列化后变为false了,经查发现是通用组件中做了处理,特记录下。 主要是设置了这个 SerializerFeature.WriteNullBooleanAsFalse Bean Cond…...
如何实现底部导航栏
文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了TextField Widget,本章回中将介绍BottomNavigationBar Widget。闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中将介绍一个新的Widget:BottomNavigationBar,它就是我们经常在App中看到了底部…...
【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。
【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。 文章目录 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。1. 错…...
org.apache.zookeeper.server.quorum.QuorumPeerMain
QuorumPeerMain源代码 package org.apache.zookeeper.server.quorum;import java.io.IOException; import javax.management.JMException; import javax.security.sasl.SaslException; import org.apache.yetus.audience.InterfaceAudience; import org.apache.zookeeper.audi…...
如何在yolov8中使用ATSS策略
在yolov8中使用的标签匹配策略是TAL,本篇文章解析一下ATSS代码相关实现以及如何把ATSS放到yolov8中使用 看过本专栏中的另外两篇文章的同学应该对v8解析box那一套很熟悉了,ATSS的第一步就是去得到一系列的anchor-box(如果是anchor-based检测方法)或者anchor-point(基…...
常见的邮件协议SMTP和POP3
常见的邮件协议包括SMTP和POP3,SMTP用来发送邮件,POP3用来接收邮件信息。 SMTP SMTP 是一种用于发送电子邮件的协议。它的主要作用是将**电子邮件**从邮件客户端(如 Outlook、Thunderbird)或邮件服务器发送到接收服务器。 SMTP …...
线性代数行列式
目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得:分…...
cin/cout性能问题讨论和优化⽅法
样例解析: 在上面的两个案例中,我们发现虽然代码的逻辑是相同的,唯一的不同点在于scanf和cout的使用区别,一份超时一份ac,这是为什么呢?是否有可行的优化方法呢? 背景知识: 在 C 中…...
轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片
轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片 数据集分割 训练组90% 706图片 有效集6% 46图片 测试集4% 33图片 预处理…...
ARM64 Windows 10 IoT工控主板运行x86程序效率测试
ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序,而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 和 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400,可预装正版Windows 10 IoT企业版操作系统,x86程序可无需修改而直接在ESM84…...
Git核心概念
版本控制 什么是版本控制 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 除了项目源代码,你可以对任何类型的文件进行版本控制。 为什么要版本控制 有了它你就可以将某个文件回溯到之前的状态,甚至将整…...