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

OpenCV相机标定与3D重建(18)根据基础矩阵(Fundamental Matrix)校正两组匹配点函数correctMatches()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

优化对应点的坐标。
cv::correctMatches 是 OpenCV 库中的一个函数,用于根据基础矩阵(Fundamental Matrix)校正两组匹配点。该函数通过最小化重投影误差来优化匹配点的位置,从而提高特征点匹配的准确性。

函数原型


void cv::correctMatches
(InputArray 	F,InputArray 	points1,InputArray 	points2,OutputArray 	newPoints1,OutputArray 	newPoints2 
)		

参数

  • 参数F:3x3 的基础矩阵。
  • 参数points1:包含第一组点的 1xN 数组。
  • 参数points2:包含第二组点的 1xN 数组。
  • 参数newPoints1:优化后的第一组点。
  • 参数newPoints2:优化后的第二组点。

该函数实现了最优三角化方法(详见《Multiple View Geometry》[115])。对于每个给定的点对应关系points1[i] <-> points2[i] 和一个基础矩阵 F,它计算校正后的对应关系 newPoints1[i] <-> newPoints2[i],以最小化几何误差 d ( p o i n t s 1 [ i ] , n e w P o i n t s 1 [ i ] ) 2 + d ( p o i n t s 2 [ i ] , n e w P o i n t s 2 [ i ] ) 2 d(points1[i], newPoints1[i])^2 + d(points2[i],newPoints2[i])^2 d(points1[i],newPoints1[i])2+d(points2[i],newPoints2[i])2(其中 d ( a , b ) d(a,b) d(a,b) 是点 a 和点 b 之间的几何距离),同时满足极线约束 n e w P o i n t s 2 T ⋅ F ⋅ n e w P o i n t s 1 = 0 newPoints2^T \cdot F \cdot newPoints1 = 0 newPoints2TFnewPoints1=0

使用场景

  • 立体视觉:在双目或多目视觉系统中,用于提高特征点匹配的精度。
  • 结构光扫描:在校正三维重建过程中使用的匹配点时非常有用。
  • 运动估计:在基于特征点的运动估计任务中,可以提高估计的准确性。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 假设我们已经得到了基础矩阵 F 和两组匹配点 points1 和 points2cv::Mat F = ( cv::Mat_< double >( 3, 3 ) << 0.998, -0.062, 0.007, 0.062, 0.998, -0.05, 0.007, 0.05, 1.0 );// 定义一些匹配点std::vector< cv::Point2f > points1 = { cv::Point2f( 100, 150 ), cv::Point2f( 200, 250 ) };std::vector< cv::Point2f > points2 = { cv::Point2f( 105, 155 ), cv::Point2f( 205, 255 ) };// 创建输出容器std::vector< cv::Point2f > newPoints1;std::vector< cv::Point2f > newPoints2;// 优化对应点的坐标cv::correctMatches( F, points1, points2, newPoints1, newPoints2 );// 打印结果for ( size_t i = 0; i < newPoints1.size(); ++i ){std::cout << "Original Points: (" << points1[ i ].x << ", " << points1[ i ].y << ") -> (" << points2[ i ].x << ", " << points2[ i ].y << ")\n";std::cout << "Optimized Points: (" << newPoints1[ i ].x << ", " << newPoints1[ i ].y << ") -> (" << newPoints2[ i ].x << ", " << newPoints2[ i ].y << ")\n";}return 0;
}

运行结果

Original Points: (100, 150) -> (105, 155)
Optimized Points: (-39.0672, 88.7914) -> (146.107, 75.3975)
Original Points: (200, 250) -> (205, 255)
Optimized Points: (-46.7855, 188.856) -> (259.562, 81.6427)

相关文章:

OpenCV相机标定与3D重建(18)根据基础矩阵(Fundamental Matrix)校正两组匹配点函数correctMatches()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 优化对应点的坐标。 cv::correctMatches 是 OpenCV 库中的一个函数&#xff0c;用于根据基础矩阵&#xff08;Fundamental Matrix&#xff09;校…...

python脚本:向kafka数据库中插入测试数据

# coding:utf-8 import datetime import json import random import timefrom kafka import KafkaProducer生产者demo向branch-event主题中循环写入10条json数据注意事项&#xff1a;要写入json数据需加上value_serializer参数&#xff0c;如下代码producer KafkaProducer(val…...

10. 高效利用Excel导入报警信息

高效利用Excel导入报警信息 1.添加报警服务器2.导出报警EXCEL3.报警控件使用1.添加报警服务器 右键项目名称——Add New Sever——Tag Alarm and Event Sever 给报警服务器命名Alarm 给报警服务器分配优先级。如果想要使能历史的话需要和SQL sever配合使用,之前写过。记住这…...

k8s service 配置AWS nlb load_balancing.cross_zone.enabled

在Kubernetes中配置NLB&#xff08;Network Load Balancer&#xff09;的跨区域负载均衡&#xff08;cross-zone load balancing&#xff09;&#xff0c;需要使用服务注解&#xff08;service annotations&#xff09;来实现。根据AWS官方文档&#xff0c;以下是配置NLB跨区域…...

国标GB28181网页直播平台EasyGBS国标GB28181-2016协议解读:媒体流保活机制

GB28181-2016在为视频监控系统提供统一的网络视频传输协议。这项标准主要用于公共安全视频监控系统&#xff0c;支持视频监控设备间的互联互通。其主要应用场景包括城市公共安全监控、交通监控、消防监控等。 GB28181-2016标准中的媒体流保活机制&#xff0c;主要是在确保视频…...

面试经验分享 | 杭州某安全大厂渗透测试岗

目录&#xff1a; 所面试的公司&#xff1a;某安全大厂   所在城市&#xff1a;杭州    面试职位&#xff1a;渗透测试工程师    面试过程&#xff1a;  面试官的问题&#xff1a;    1、面试官开始就问了我&#xff0c;为什么要学网络安全&#xff1f;   …...

26. Three.js案例-自定义多面体

26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染&#xff0c;并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…...

HarmonyOS-高级(四)

文章目录 应用开发安全应用DFX能力介绍HiLog使用指导HiAppEvent &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月11日11点18分 应用开发安全 应用隐私保护 隐私声明弹窗的作…...

Qt-chart 画折线图(以时间为x轴)

上图 代码 #include <iostream> #include <random> #include <qcategoryaxis.h>void MainWindow::testLine() {//1、创建图表视图QChartView* view new QChartView(this);//2.创建图表QChart* chart new QChart();//3.将图表设置给图表视图view->setCh…...

【入门】晶晶的补习班

描述 晶晶上初中了。妈妈认为晶晶应该更加用功学习&#xff0c;所以晶晶除了上学之外&#xff0c;还要参加妈妈为她报名的各科补习班。晶晶的妈妈给了晶晶的下周每天上补习班的小时数&#xff0c;晶晶同学想知道&#xff0c;下周平均一天要上多少小时的补习班&#xff08;结果…...

c#动态更新替换json节点

需求项目json作为主模板&#xff0c;会应用到多个子模版&#xff0c;当后续项目变更只需要修改主模板中节点&#xff0c;并且能够动态更新到原来的子模版中去。 主模板示例&#xff1a; {"A": {"A1": "","A2": false,"A3"…...

cf补题日记

听退役选手建议&#xff0c;补40道C、D题。 &#xff08;又又又开新专题。。。 进度&#xff1a;2/40 原题1&#xff1a; You are given a string ss, consisting of digits from 00 to 99. In one operation, you can pick any digit in this string, except for 00 or the…...

Golang学习笔记_01——包

文章目录 包&#xff08;package&#xff09;1. 定义2. 导入3. 初始化4. 可见性4. 注意4.1 包声明4.2 main包4.3 包的导入4.4标识符的可见性4.5 包的初始化4.6 避免命名冲突4.7 包的路径和名称4.8 匿名导入4.9 使用Go Modules 包&#xff08;package&#xff09; 在Golang&…...

RPC设计--应用层缓冲区,TcpBuffer

为什么需要应用层的buffer 为了方便数据处理&#xff0c;从fd上直接读写然后做包的组装、拆解不够方便方便异步发送&#xff0c;将数据写到应用层buffer后即可返回&#xff0c;让epoll即event_loop去异步发送。提高发送效率&#xff0c;多个小包可合并发送 buffer 设计 可以…...

基于单片机智能控制的饮水机控制系统

基于单片机智能控制的饮水机控制系统&#xff0c;以STC89C52单片机为核心&#xff0c;利用防水型DS18B20温度传感器对饮水机内的水温做出检测&#xff0c;其次利用水位传感器对饮水机内的水量做出检测&#xff0c;并显示在OLED液晶显示屏上。用户在使用饮水机时&#xff0c;通过…...

路径规划 | 改进的人工势场法APF算法进行路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 改进的人工势场法&#xff08;APF&#xff09;路径规划算法 在路径规划中&#xff0c;人工势场法&#xff08;APF&#xff09;是一种常见的方法&#xff0c;但传统的APF算法容易陷入局部极小值&#xff0c;导致路径规…...

【云原生知识】Kubernets实践-前端服务如何访问后端服务

文章目录 概述步骤1&#xff1a;部署后端服务步骤2&#xff1a;配置Nginx步骤3&#xff1a;创建Nginx服务总结 如何确保 Nginx 能持续访问后端服务&#xff1f;相关文献 概述 假设你正在使用Kubernetes作为容器云平台&#xff0c;以下是如何配置Nginx以及相关服务&#xff0c;…...

【ubuntu18.04】ubuntu18.04安装EasyCwmp操作说明

参考链接 Tutorial – EasyCwmphttps://easycwmp.org/tutorial/ EasyCwmp 介绍 EasyCwmp 设计包括 2 个部分&#xff1a; EasyCwmp 核心&#xff1a;它包括 TR069 CWMP 引擎&#xff0c;负责与 ACS 服务器的通信。它是用 C 语言开发的。EasyCwmp DataModel&#xff1a;它包…...

使用Jackson库的ObjectMapper类将JSON字符串转换为Java的Map对象

本教程展示如何使用Jackson库的ObjectMapper类将JSON字符串转换为Java的Map对象。 下面是具体的步骤和代码示例&#xff0c;包括添加依赖项以及编写用于反序列化JSON字符串为Map的代码。 添加依赖项 首先&#xff0c;在你的项目中添加Jackson库的依赖。如果你使用的是Maven构…...

ASP.NET Core实现鉴权授权的几个库

System.IdentityModel.Tokens.Jwt 和 Microsoft.AspNetCore.Authentication.JwtBearer 是两个常用的库&#xff0c;分别用于处理 JWT&#xff08;JSON Web Token&#xff09;相关的任务。它们在功能上有一定重叠&#xff0c;但侧重点和使用场景有所不同。 1. System.IdentityM…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...