OpenCV相机标定与3D重建(48)对三台相机进行极线校正(rectification)函数rectify3Collinear()的使用

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

算法描述

计算3头相机的极线校正变换,其中所有相机头都在同一条直线上。

cv::rectify3Collinear 是 OpenCV 库中的一个函数,用于对三台相机进行极线校正(rectification),假设这三台相机是共线排列的。该函数通常用于多视图几何和立体视觉应用中,以确保来自不同相机的图像可以在同一平面上匹配,从而简化了特征点的对应查找。

函数原型

cpp 复制代码
float cv::rectify3Collinear	
(
	InputArray 	cameraMatrix1,
	InputArray 	distCoeffs1,
	InputArray 	cameraMatrix2,
	InputArray 	distCoeffs2,
	InputArray 	cameraMatrix3,
	InputArray 	distCoeffs3,
	InputArrayOfArrays 	imgpt1,
	InputArrayOfArrays 	imgpt3,
	Size 	imageSize,
	InputArray 	R12,
	InputArray 	T12,
	InputArray 	R13,
	InputArray 	T13,
	OutputArray 	R1,
	OutputArray 	R2,
	OutputArray 	R3,
	OutputArray 	P1,
	OutputArray 	P2,
	OutputArray 	P3,
	OutputArray 	Q,
	double 	alpha,
	Size 	newImgSize,
	Rect * 	roi1,
	Rect * 	roi2,
	int 	flags 
)		

参数

  • 参数cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, cameraMatrix3, distCoeffs3:分别是三台相机的内参矩阵和畸变系数。
  • 参数imgpt1, imgpt3:分别是第一台和第三台相机中的匹配点集。
  • 参数imageSize:输入图像的尺寸。
  • 参数R12, T12, R13, T13:分别是第一到第二台相机和第一到第三台相机之间的相对旋转和平移。
  • 参数R1, R2, R3:输出的三台相机的校正旋转矩阵。
  • 参数P1, P2, P3:输出的三台相机的投影矩阵。
  • 参数Q:输出的4x4 disparity-to-depth映射矩阵,用于从视差图生成深度图。
  • 参数alpha:自由缩放参数,用于控制重投影误差和有效像素数之间的权衡。
  • 参数newImgSize:校正后的图像尺寸。
  • 参数roi1, roi2:输出的感兴趣区域(ROI),分别对应于第一台和第二台相机的有效像素区域。
  • 参数flags:极线校正标志,定义了如何执行校正(例如是否使用零扭曲)。

代码示例

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

using namespace cv;
using namespace std;

int main()
{
    // 假设我们已经有了三台相机的内参矩阵、畸变系数、相对姿态等信息
    Mat cameraMatrix1 = (Mat_<double>(3, 3) << /* ... */);
    Mat distCoeffs1 = (Mat_<double>(5, 1) << /* ... */);
    Mat cameraMatrix2 = (Mat_<double>(3, 3) << /* ... */);
    Mat distCoeffs2 = (Mat_<double>(5, 1) << /* ... */);
    Mat cameraMatrix3 = (Mat_<double>(3, 3) << /* ... */);
    Mat distCoeffs3 = (Mat_<double>(5, 1) << /* ... */);

    vector<Point2f> imgpt1[] = {/* ... */}; // 匹配点集
    vector<Point2f> imgpt3[] = {/* ... */}; // 匹配点集

    Size imageSize(640, 480); // 图像尺寸
    Mat R12 = (Mat_<double>(3, 3) << /* ... */); // 相对旋转
    Mat T12 = (Mat_<double>(3, 1) << /* ... */); // 相对平移
    Mat R13 = (Mat_<double>(3, 3) << /* ... */); // 相对旋转
    Mat T13 = (Mat_<double>(3, 1) << /* ... */); // 相对平移

    Mat R1, R2, R3; // 输出的校正旋转矩阵
    Mat P1, P2, P3; // 输出的投影矩阵
    Mat Q;          // 输出的 disparity-to-depth 映射矩阵
    double alpha = -1; // 自由缩放参数
    Size newImgSize = imageSize; // 校正后的图像尺寸
    Rect roi1, roi2; // 输出的感兴趣区域

    float reprojErr = rectify3Collinear(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2,
                                        cameraMatrix3, distCoeffs3, imgpt1, imgpt3,
                                        imageSize, R12, T12, R13, T13,
                                        R1, R2, R3, P1, P2, P3, Q, alpha, newImgSize, &roi1, &roi2,
                                        CALIB_ZERO_DISPARITY);

    cout << "Reprojection error: " << reprojErr << endl;

    return 0;
}
相关推荐
Martina_03219 小时前
AI生成的过山车轨道导入后频繁脱轨?用5步检查样条、轨距与碰撞
图像处理·人工智能·游戏·3d·材质·游戏策划·关卡设计
Martina_03219 小时前
AI生成的模块场景一烘焙就有黑边?用6步检查Lightmap UV、纹素密度与Padding
人工智能·游戏·3d·aigc·uv·游戏策划·关卡设计
黑妹天下第一乖11 小时前
第 05 讲:阿加犀 AidCV 图像处理加速与 OpenCV 一致开发实战
开发语言·图像处理·人工智能·嵌入式硬件·数码相机·opencv·计算机视觉
西红柿炖牛腩35412 小时前
Web3D 加载卡顿:GLB 几何重、贴图大、格式散,本地 3D 模型压缩怎么选
3d·贴图
熊猫钓鱼>_>13 小时前
从2D平铺到3D沉浸:我用HarmonyOS 7端侧AI做了一个全程数据不出设备的空间化私密相册
前端·人工智能·3d·华为·华为云·harmonyos·鸿蒙
Martina_032113 小时前
AI生成的盔甲换动作后漂移?用6步检查挂点、骨架映射与 Bind Pose
人工智能·游戏·3d·ai·自然语言处理·aigc·游戏策划
创世虚拟世界1 天前
从零打通 MCP 访问创世虚拟世界CRM的 3D 数据,我搭了一个可直接调用的演示站
3d
李游Leo1 天前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 高斯参数的非有限值隔离与可渲染性门禁【鸿蒙心迹】
开发语言·c++·3d·harmonyos
迁移科技1 天前
小体积蕴含大能量:Epic Eye Pixel Mini轻量化相机的应用美学
人工智能·3d·自动化·视觉检测
Martina_03211 天前
同一片森林换个镜头就忽冷忽暖?用6步统一曝光、LUT与相机后处理
人工智能·游戏·数学建模·3d·自然语言处理·aigc·游戏策划