OpenCV相机标定与3D重建(7)鱼眼镜头立体校正的函数stereoRectify()的使用

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

算法描述

cv::fisheye::stereoRectify 是 OpenCV 中用于鱼眼镜头立体校正的函数。该函数计算两个相机之间的校正变换,使得从两个相机拍摄的图像中的对应点在行上对齐。这一步骤对于后续的立体匹配和深度估计非常重要。

函数原型

void cv::fisheye::stereoRectify
(
	InputArray 	K1,
	InputArray 	D1,
	InputArray 	K2,
	InputArray 	D2,
	const Size & 	imageSize,
	InputArray 	R,
	InputArray 	tvec,
	OutputArray 	R1,
	OutputArray 	R2,
	OutputArray 	P1,
	OutputArray 	P2,
	OutputArray 	Q,
	int 	flags,
	const Size & 	newImageSize = Size(),
	double 	balance = 0.0,
	double 	fov_scale = 1.0 
)		

参数

  • 参数K1: 第一个相机的内参矩阵。
  • 参数D1: 第一个相机的畸变参数。
  • 参数K2: 第二个相机的内参矩阵。
  • 参数D2: 第二个相机的畸变参数。
  • 参数imageSize: 用于立体标定的图像尺寸。
  • 参数R: 第一和第二个相机坐标系之间的旋转矩阵。
  • 参数tvec: 相机坐标系之间的平移向量。
  • 参数R1: 输出第一个相机的3x3校正变换(旋转矩阵)。
  • 参数R2: 输出第二个相机的3x3校正变换(旋转矩阵)。
  • 参数P1: 在新的(校正后的)坐标系统中,输出第一个相机的3x4投影矩阵。
  • 参数P2: 在新的(校正后的)坐标系统中,输出第二个相机的3x4投影矩阵。
  • 参数Q: 输出4×4的视差到深度映射矩阵(见 reprojectImageTo3D 函数)。
  • 参数flags: 操作标志,可以是0或 fisheye::CALIB_ZERO_DISPARITY。如果设置了该标志,函数将使每个相机的主点在校正后的视图中具有相同的像素坐标。如果没有设置该标志,函数可能仍然会在水平或垂直方向上移动图像(取决于极线的方向),以最大化有用的图像区域。
  • 参数newImageSize: 校正后的新图像分辨率。应将相同的大小传递给 initUndistortRectifyMap(参见OpenCV示例目录中的 stereo_calib.cpp)。当传递 (0,0) 时(默认值),它被设置为原始的 imageSize。将其设置为更大的值可以帮助你保留原始图像中的细节,特别是在存在较大径向畸变的情况下。
  • 参数balance: 设置新的焦距范围在最小焦距和最大焦距之间。平衡值在 [0, 1] 范围内。
  • 参数fov_scale: 新焦距的除数。

代码示例


#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 相机内参矩阵 K1 和 K2
    cv::Mat K1 = (cv::Mat_<double>(3, 3) << 458.654, 0, 367.215, 0, 457.296, 248.375, 0, 0, 1);
    cv::Mat K2 = (cv::Mat_<double>(3, 3) << 458.654, 0, 367.215, 0, 457.296, 248.375, 0, 0, 1);

    // 畸变系数 D1 和 D2
    cv::Mat D1 = (cv::Mat_<double>(1, 4) << 0.0695303, -0.160713, -0.00480225, 0.000911994);
    cv::Mat D2 = (cv::Mat_<double>(1, 4) << 0.0695303, -0.160713, -0.00480225, 0.000911994);

    // 图像尺寸
    cv::Size imageSize(720, 576);

    // 旋转矩阵 R 和平移向量 tvec
    cv::Mat R = (cv::Mat_<double>(3, 3) << 1, 0, 0, 0, 1, 0, 0, 0, 1); // 示例数据
    cv::Mat tvec = (cv::Mat_<double>(3, 1) << 0.1, 0.05, 0.02); // 示例数据

    // 输出的校正旋转矩阵
    cv::Mat R1, R2;

    // 输出的投影矩阵
    cv::Mat P1, P2;

    // 输出的重投影矩阵
    cv::Mat Q;

    // 进行立体校正
    cv::fisheye::stereoRectify(
        K1, D1, K2, D2,
        imageSize, R, tvec,
        R1, R2, P1, P2, Q,
        cv::CALIB_ZERO_DISPARITY,
        imageSize, 0.0, 1.0
    );

    // 打印结果
    std::cout << "R1: " << std::endl << R1 << std::endl;
    std::cout << "R2: " << std::endl << R2 << std::endl;
    std::cout << "P1: " << std::endl << P1 << std::endl;
    std::cout << "P2: " << std::endl << P2 << std::endl;
    std::cout << "Q: " << std::endl << Q << std::endl;

    return 0;
}

运行结果

R1: 
[0.8804509063256238, 0.4402254531628119, 0.1760901812651247;
 -0.4402254531628119, 0.8969404364876068, -0.04122382540495731;
 -0.1760901812651247, -0.04122382540495731, 0.9835104698380172]
R2: 
[0.8804509063256238, 0.4402254531628119, 0.1760901812651247;
 -0.4402254531628119, 0.8969404364876068, -0.04122382540495731;
 -0.1760901812651247, -0.04122382540495731, 0.9835104698380172]
P1: 
[463.3157037596288, 0, 216.7917896240862, 0;
 0, 463.3157037596288, 262.3111277744742, 0;
 0, 0, 1, 0]
P2: 
[463.3157037596288, 0, 216.7917896240862, 52.62254833641767;
 0, 463.3157037596288, 262.3111277744742, 0;
 0, 0, 1, 0]
Q: 
[1, 0, 0, -216.7917896240862;
 0, 1, 0, -262.3111277744742;
 0, 0, 0, 463.3157037596288;
 0, 0, -8.804509063256239, 0]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小米PC电脑手机互联互通,小米妙享,小米电脑管家,老款小米笔记本怎么使用,其他品牌笔记本怎么使用,一分钟教会你

说在前面 之前我们体验过妙享中心&#xff0c;里面就有互联互通的全部能力&#xff0c;现在有了小米电脑管家&#xff0c;老款的笔记本竟然用不了&#xff0c;也可以理解&#xff0c;毕竟老款笔记本做系统研发的时候没有预留适配的文件补丁&#xff0c;至于其他品牌的winPC小米…

Apache Zeppelin:一个基于Web的大数据可视化分析平台

今天给大家推荐一下 Apache Zeppelin&#xff0c;它是一个基于 Web 的交互式数据接入、数据分析、数据可视化以及协作文档 Notebook&#xff0c;类似于 Jupyter Notebook。 Apache Zeppelin 支持使用 SQL、Java、Scala、Python、R 等编程语言进行数据处理和分析&#xff0c;同时…

彻底理解如何保证ElasticSearch和数据库数据一致性问题

一.业务场景举例 需求&#xff1a; 一个卖房业务&#xff0c;双十一前一天&#xff0c;维护楼盘的运营人员突然接到合作开发商的通知&#xff0c;需要上线一批热门的楼盘列表&#xff0c;上传完成后&#xff0c;C端小程序支持按楼盘的名称、户型、面积等产品属性全模糊搜索热门…

EasyExcel: 结合springboot实现表格导出入(单/多sheet), 全字段校验,批次等操作(全)

全文目录,一步到位 1.前言简介1.1 链接传送门1.1.1 easyExcel传送门 2. Excel表格导入过程2.1 easyExcel的使用准备工作2.1.1 导入maven依赖2.1.2 建立一个util包2.1.3 ExcelUtils统一功能封装(单/多sheet导入)2.1.4 ExcelDataListener数据监听器2.1.5 ResponseHelper响应值处理…

前端实用知识-用express搭建本地服务器

目录 一、为什么会有这篇文章&#xff1f; 二、使用前的准备-如环境、工具 三、如何使用&#xff1f;-express常用知识点 四、代码演示-配合截图&#xff0c;简单易懂 一、为什么会有这篇文章&#xff1f; 在日常前端开发中&#xff0c;我们离不开数据&#xff0c;可能是用…

Redis(概念、IO模型、多路选择算法、安装和启停)

一、概念 关系型数据库是典型的行存储数据库&#xff0c;存在的问题是&#xff0c;按行存储的数据在物理层面占用的是连续存储空间&#xff0c;不适合海量数据存储。 Redis在生产中使用的最多的是用作数据缓存。 服务器先在缓存中查询数据&#xff0c;查到则返回&#xff0c;…

C#基础控制台程序

11.有一个54的矩阵&#xff0c;要求编程序求出其中值最大的那个元素的值&#xff0c;以及其所在的行号和列号。 12.从键盘输入一行字符&#xff0c;统计其中有多少个单词&#xff0c;单词之间用空格分隔开。 13.输入一个数&#xff0c;判断它是奇数还是偶数&#xff0c;如果…

Flink开发入门简单案例--统计实时流订单

Flink开发入门简单案例 0.简介1.订单数据生成器1.1 新建工程TestFlink1.2 在pom.xml中引入Flink依赖包1.3 订单数据生成类订单类&#xff08;Item&#xff09;订单生成数据流类测试订单生成类 2.订单统计2.1 仅统计订单中商品的件数 2.2 同时统计商品数量和金额 0.简介 本案例…

AI前景分析展望——GPTo1 SoraAI

引言 人工智能&#xff08;AI&#xff09;领域的飞速发展已不仅仅局限于学术研究&#xff0c;它已渗透到各个行业&#xff0c;影响着从生产制造到创意产业的方方面面。在这场技术革新的浪潮中&#xff0c;一些领先的AI模型&#xff0c;像Sora和OpenAI的O1&#xff0c;凭借其强大…

PAT1085 Perfect Sequence(25)

//判断是否是连续的数 //判断是否只能第一个数是最小值 #include <cstdio> #include <algorithm> typedef long long ll; using namespace std; int n,p; const int maxn 100010; int arr[maxn];int binary(int l, int r, ll tgt){if(arr[n-1] < tgt) return n…

QChart数据可视化

目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …

SpringBoot源码-spring boot启动入口ruan方法主线分析(一)

一、SpringBoot启动的入口 1.当我们启动一个SpringBoot项目的时候&#xff0c;入口程序就是main方法&#xff0c;而在main方法中就执行了一个run方法。 SpringBootApplication public class StartApp {public static void main(String[] args) {// testSpringApplication.ru…

C#变量和函数如何和unity组件绑定

1.Button On_click (1)GameObject通过Add component添加上Script (2)Button选GameObject组件而不是直接选Script,直接选Script出现不了Script中的函数 2.RawImage 上面是错的 3.Text 上面是错的&#xff0c;应该是直接在GameObject里面填上对应的值 总结&#xff1a; …

Flink Sink的使用

经过一系列Transformation转换操作后&#xff0c;最后一定要调用Sink操作&#xff0c;才会形成一个完整的DataFlow拓扑。只有调用了Sink操作&#xff0c;才会产生最终的计算结果&#xff0c;这些数据可以写入到的文件、输出到指定的网络端口、消息中间件、外部的文件系统或者是…

【Spring MVC】如何获取cookie/session以及响应@RestController的理解,Header的设置

前言 &#x1f31f;&#x1f31f;本期讲解关于SpringMVC的编程之参数传递~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废…

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件 文章目录 使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件什么是 exe4j准备工作打包 Spring Boot 项目为 EXE 文件1.启动 exe4j2. 选择项目类型3. 配置项目名称和输出目录4. 配置项目类型或可执行文件名称5. java配…

前端JavaScript(一)---基本介绍

Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;比如Perl&#xff0c;遗留的速度问题&#xff0c;为客户提供更流畅的浏览效果。当时服务端需要对…

阿里Qwen系列开源模型介绍

模型种类丰富 Qwen2&#xff1a;包含Qwen2-0.5b、Qwen2-1.5b、Qwen2-7b、Qwen2-57b-a14b以及Qwen2-72b等五种规模的预训练和指令微调模型&#xff0c;其在多语言处理、长文本处理、代码生成、数学和逻辑推理等能力上&#xff0c;在mmlu、gpqa、humaneval等国际测评中得到了验证…

基于Java的小程序电商商城开源设计源码

近年来电商模式的发展越来越成熟&#xff0c;基于 Java 开发的小程序电商商城开源源码&#xff0c;为众多开发者和企业提供了构建个性化电商平台的有力工具。 基于Java的电子商城购物平台小程序的设计在手机上运行&#xff0c;可以实现管理员&#xff1b;首页、个人中心、用户…

开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序源码助力品牌共建:价值、策略与实践

摘要&#xff1a;在当今数字化商业环境下&#xff0c;品牌构建已演变为企业与消费者深度共建的过程。本文聚焦于“开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序源码”&#xff0c;探讨其如何融入品牌建设&#xff0c;通过剖析品牌价值构成&#xff0c;阐述该技术工具在助力…