OpenCV相机标定与3D重建(46)将三维空间中的点投影到二维图像平面上函数projectPoints()的使用

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

算法描述

将3D点投影到图像平面上。

cv::projectPoints 是 OpenCV 库中的一个函数,用于将三维空间中的点投影到二维图像平面上。这个过程涉及到相机的内参矩阵、外参(旋转和平移向量)以及畸变系数。该函数可以用来模拟或校正从3D世界坐标到2D图像坐标的转换。

函数原型

cpp 复制代码
void cv::projectPoints	
(
	InputArray 	objectPoints,
	InputArray 	rvec,
	InputArray 	tvec,
	InputArray 	cameraMatrix,
	InputArray 	distCoeffs,
	OutputArray 	imagePoints,
	OutputArray 	jacobian = noArray(),
	double 	aspectRatio = 0 
)		

参数

  • 参数objectPoints:相对于世界坐标系表达的对象点数组。可以是3xN/Nx3的单通道矩阵或1xN/Nx1的三通道矩阵(或 vector),其中N是视图中的点数。
  • 参数rvec:旋转向量(Rodrigues形式),与 tvec 一起,执行从世界坐标系到相机坐标系的基变换,详见 calibrateCamera 的说明。
  • 参数tvec:平移向量,参见上述参数描述。
  • 参数cameraMatrix:相机内参矩阵 A = f x 0 c x 0 f y c y 0 0 1 . A = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}. A= fx000fy0cxcy1 . 。
  • 参数distCoeffs:输入的畸变系数向量 ( k 1 , k 2 , p 1 , p 2 , k 3 \[ , k 4 , k 5 , k 6 \[ , s 1 , s 2 , s 3 , s 4 \[ , τ x , τ y ] ] ] ) (k_1, k_2, p_1, p_2, k_3\[, k_4, k_5, k_6\[, s_1, s_2, s_3, s_4\[, \\tau_x, \\tau_y]]]) (k1,k2,p1,p2,k3\[,k4,k5,k6\[,s1,s2,s3,s4\[,τx,τy]]]),包含4、5、8、12或14个元素。如果向量为空,则假设畸变为零。
  • 参数imagePoints:输出的图像点数组,可以是1xN/Nx1的双通道矩阵,或 vector。
  • 参数jacobian:可选输出的 2N×(10+) 雅可比矩阵,表示图像点坐标对旋转向量、平移向量、焦距、主点坐标和畸变系数各分量的偏导数。在旧接口中,雅可比矩阵的不同部分通过不同的输出参数返回。
  • 参数aspectRatio:可选的"固定纵横比"参数。如果该参数不为0,函数假定纵横比 ( f x / f y ) (f_x / f_y) (fx/fy)是固定的,并相应地调整雅可比矩阵。

函数描述:

该函数根据给定的相机内部和外部参数计算3D点到图像平面的2D投影。可选地,函数还可以计算雅可比矩阵------即图像点坐标(作为所有输入参数的函数)对特定参数(内部或外部)的偏导数矩阵。这些雅可比矩阵用于 calibrateCamera、solvePnP 和 stereoCalibrate 中的全局优化过程。该函数本身也可以用来计算重投影误差,给定当前的内部和外部参数。

注意:

通过设置 rvec = tvec = 0,0,0,或将 cameraMatrix 设置为3x3的单位矩阵,或传递零畸变系数,可以获得函数的各种有用的部分情况。这意味着,可以在理想零畸变设置下计算稀疏点集的畸变坐标或应用透视变换(并计算导数)。

代码示例

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    // 定义3D点
    vector< Point3f > objectPoints = { Point3f( 0, 0, 0 ), Point3f( 1, 0, 0 ), Point3f( 0, 1, 0 ) };

    // 相机姿态(旋转和平移)
    Mat rvec = ( Mat_< double >( 3, 1 ) << 0, 0, 0 );  // 无旋转
    Mat tvec = ( Mat_< double >( 3, 1 ) << 0, 0, 0 );  // 无平移

    // 相机内参矩阵
    Mat cameraMatrix = ( Mat_< double >( 3, 3 ) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1 );

    // 畸变系数(假设无畸变)
    Mat distCoeffs = Mat::zeros( 5, 1, CV_64F );

    // 定义输出变量
    vector< Point2f > imagePoints;

    // 执行投影
    projectPoints( objectPoints, rvec, tvec, cameraMatrix, distCoeffs, imagePoints );

    // 打印结果
    cout << "Projected Image Points:" << endl;
    for ( size_t i = 0; i < imagePoints.size(); ++i )
    {
        cout << "(" << imagePoints[ i ].x << ", " << imagePoints[ i ].y << ")" << endl;
    }

    return 0;
}

运行结果

bash 复制代码
Projected Image Points:
(320, 240)
(1320, 240)
(320, 1240)
相关推荐
时间的情敌1 天前
Cesium 加载 3D Tiles 倾斜摄影、压平、样式设置(Vue3 实战)
vue.js·3d·cesium
会飞锦鲤2 天前
基于 SVM + HOG 的铸造缺陷检测系统
python·opencv·机器学习·计算机视觉·缺陷检测·图像分类·svm
AGI_Eval3 天前
AI 3D生成技术:从“可用”走向“可靠”还有多远?
人工智能·3d
翌日阳4 天前
二十分之一的压缩比:Spatial Vivid 1.0 把 3DGS 全链路参考实现按 MIT 开源了
3d·开源
Dream-Y.ocean5 天前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
硕迪科技SOLIDWORKS5 天前
SOLIDWORKS Electrical 2027:从线束定义到2D–3D更改分析
3d·solidworks 202
DolitD5 天前
UE像素流与云渲染技术方案对比分析
3d·云原生·ue5·云计算·图形渲染
tealcwu5 天前
【Unity高级】Unity URP:构建同时支持 2D 与 3D 场景的项目完全指南
3d·unity·游戏引擎
Jmyd01235 天前
文物3D数字化的技术选型指南:从WW/T 0115标准到落地工程,一次讲透采集、建档、管理与展示
3d·系统架构·博物馆·数字展厅·博物馆数字化
Martina_03215 天前
AI生成3D模型一合并网格,材质就串色?用6步检查材质槽、UV与图集重映射
图像处理·人工智能·3d·材质·uv·游戏策划·1024程序员节