OpenCV相机标定与3D重建(41)从 3D 物点和它们对应的 2D 图像点估算初始相机内参矩阵函数initCameraMatrix2D()的使用

devtools/2025/1/7 20:27:10/
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

从3D-2D点对应关系中找到一个初始的相机内参矩阵。

cv::initCameraMatrix2D 是 OpenCV 库中的一个函数,用于从 3D 物点和它们对应的 2D 图像点估算初始相机内参矩阵。该函数通常作为相机标定过程的一部分,为后续的标定提供一个合理的初始猜测。

函数原型


Mat cv::initCameraMatrix2D
(InputArrayOfArrays 	objectPoints,InputArrayOfArrays 	imagePoints,Size 	imageSize,double 	aspectRatio = 1.0 
)	

参数

  • 参数objectPoints: 校准图案点在校准图案坐标空间中的向量的向量。在校准图案坐标系中,每个视图的点集组成一个向量,并且这些向量被组合成一个更大的向量。在旧接口中,所有每视图的向量都被连接起来。详见 calibrateCamera 的详细说明。
  • 参数imagePoints: 校准图案点投影的向量的向量。在图像坐标系中,每个视图的点集组成一个向量,并且这些向量被组合成一个更大的向量。在旧接口中,所有每视图的向量都被连接起来。
  • 参数imageSize: 用于初始化主点(光心)的图像尺寸(以像素为单位)。
  • 参数aspectRatio: 如果它为零或负数,则 fx 和 fy 将独立估计。否则,fx = fy ⋅ aspectRatio。
    该函数估计并返回一个用于相机标定过程的初始相机内参矩阵。目前,该函数仅支持平面校准图案,即每个物体点的 z 坐标 = 0。

返回值

Mat: 返回一个3x3的浮点数矩阵,表示初步估计的相机内参矩阵,形式如下:
c a m e r a M a t r i x = [ f x 0 c x 0 f y c y 0 0 1 ] \mathbf{cameraMatrix} = \left[ \begin{array}{ccc} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{array} \right] cameraMatrix= fx000fy0cxcy1
其中:

  • f x f_x fx f y f_y fy分别是沿 x 轴和 y 轴的焦距(以像素为单位)。
  • c x c_x cx c y c_y cy 是主点(光轴与图像平面交点)的位置。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>using namespace cv;
using namespace std;int main()
{// 假设的图像尺寸 (宽度, 高度)Size imageSize( 640, 480 );// 创建虚拟的3D物点(例如棋盘格角点)vector< Point3f > objp;int boardWidth   = 9;     // 棋盘格宽度int boardHeight  = 6;     // 棋盘格高度float squareSize = 1.0f;  // 单位长度for ( int i = 0; i < boardHeight; ++i ){for ( int j = 0; j < boardWidth; ++j ){objp.push_back( Point3f( j * squareSize, i * squareSize, 0 ) );}}// 创建虚拟的2D图像点vector< vector< Point2f > > imagePoints;vector< vector< Point3f > > objectPoints;Mat cameraMatrix = Mat::eye( 3, 3, CV_64F );    // 单位矩阵作为初始相机内参矩阵Mat distCoeffs   = Mat::zeros( 5, 1, CV_64F );  // 无畸变假设RNG rng( 12345 );                               // 使用随机数生成器// 生成一组虚拟的视图for ( size_t view = 0; view < 3; ++view ){// 创建一个虚拟的旋转和平移向量Vec3f rvec = Vec3f( rng.uniform( -1.0, 1.0 ), rng.uniform( -1.0, 1.0 ), rng.uniform( -1.0, 1.0 ) );Vec3f tvec = Vec3f( rng.uniform( -100, 100 ), rng.uniform( -100, 100 ), rng.uniform( 1000, 1500 ) );// 投影3D点到2D图像平面上vector< Point2f > projectedPoints;projectPoints( objp, rvec, tvec, cameraMatrix, distCoeffs, projectedPoints );// 添加到数据集中imagePoints.push_back( projectedPoints );objectPoints.push_back( objp );}// 初始化相机内参矩阵Mat initialCameraMatrix = initCameraMatrix2D( objectPoints, imagePoints, imageSize, 1.0 );cout << "Initial Camera Matrix with virtual data:\n" << initialCameraMatrix << endl;return 0;
}

运行结果

Initial Camera Matrix with virtual data:
[460.1674038169938, 0, 319.5;0, 460.1674038169938, 239.5;0, 0, 1]

http://www.ppmy.cn/devtools/148395.html

相关文章

Jmeter-性能测试工具的安装教程

一、Jmeter是什么&#xff1f; JMeter是一个开源的Java应用程序&#xff0c;由Apache软件基金会开发和维护&#xff0c;可用于性能测试、压力测试、接口测试等。 性能测试的定义 性能测试是通过自动化工具模拟多种负载条件&#xff08;包括正常、峰值和异常负载&#xff09;&am…

kafka使用常见问题

连接不上kafka,报下边的错 org.apache.kafka.common.KafkaException: Producer is closed forcefully.at org.apache.kafka.clients.producer.internals.RecordAccumulator.abortBatches(RecordAccumulator.java:760) [kafka-clients-3.0.2.jar:na]at org.apache.kafka.client…

Ubuntu创建python虚拟环境

1、安装Python 1&#xff09;打开终端。 2&#xff09;添加deadsnakes PPA到你的系统&#xff08;如果尚未添加&#xff09;&#xff1a; sudo add-apt-repository ppa:deadsnakes/ppa 系统更新&#xff1a; sudo apt-get update 安装Python 3.9&#xff1a; sudo apt-ge…

青少年编程与数学 02-006 前端开发框架VUE 01课题、VUE简介

青少年编程与数学 02-006 前端开发框架VUE 01课题、VUE简介 一、前端开发一、前端框架二、Vue.js三、应用场景四、区别五、学习资源六、应用示例说明&#xff1a; 课题摘要:本文介绍了前端开发框架Vue.js的基本概念和特性。Vue.js是一个渐进式JavaScript框架&#xff0c;用于构…

Serializable接口

最近写项目的时候&#xff0c;发现有一些类要实现Serializable接口&#xff0c;一开始只是粗略的知道实现了Serializable接口&#xff0c;这个类的对象可以被序列化&#xff0c;但我比较轴&#xff0c;想知道这个接口到底有什么作用。 我点开这个接口发现什么方法都没有实现&am…

深入理解 PyTorch 的 Dataset 和 DataLoader:构建高效数据管道

文章目录 简介PyTorch 的 DatasetDataset 的基本概念自定义 Dataset实现 __init__ 方法示例&#xff1a;从 CSV 文件加载数据 实现 __len__ 方法实现 __getitem__ 方法另一种示例&#xff1a;直接传递列表训练集和验证集的定义 1. 单个 Dataset 类 数据分割2. 分别定义两个 Da…

第十八周:Faster R-CNN论文阅读

Faster R-CNN论文阅读 摘要Abstract文章简介1. 引言2. Faster R-CNN 框架2.1 RPN2.2 损失函数2.3 RPN的训练细节 3. Faster R-CNN的训练4. 优缺点分析总结 摘要 本篇博客介绍了 Faster R-CNN&#xff0c;这是一种双阶段的目标检测网络&#xff0c;是对 Fast R-CNN 的改进。为了…

深度解析与实践:HTTP 协议

一、引言 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是 Web 应用程序、API、微服务以及几乎所有互联网通信的核心协议。虽然它是我们日常使用的基础技术&#xff0c;但要深刻理解其高效使用、优化以及如何避免性能瓶颈&#xff0c;我…