OpenCV相机标定与3D重建(39)计算校正畸变后的新相机内参矩阵函数getOptimalNewCameraMatrix()的使用

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

算法描述

根据自由缩放参数返回新的相机内参矩阵。

cv::getOptimalNewCameraMatrix 是 OpenCV 库中的一个函数,用于计算校正畸变后的新相机内参矩阵。该函数不仅考虑了原始的相机内参和畸变系数,还允许用户通过参数 alpha 控制图像的有效区域大小,并可以选择是否将主点设置为图像中心。

该函数根据自由缩放参数计算并返回最优的新相机内参矩阵。通过改变这个参数,您可以仅获取合理的像素(alpha=0),保留所有原始图像像素(如果角落中有有价值的信息,则 alpha=1),或者得到两者之间的某种折衷。当 alpha>0 时,去畸变后的结果可能会包含一些对应于捕获的畸变图像之外的"虚拟"像素的黑边。原始的相机内参矩阵、畸变系数、计算出的新相机内参矩阵和 newImageSize 应传递给 initUndistortRectifyMap 以生成用于 remap 的映射。

函数原型

cpp 复制代码
Mat cv::getOptimalNewCameraMatrix	
(
	InputArray 	cameraMatrix,
	InputArray 	distCoeffs,
	Size 	imageSize,
	double 	alpha,
	Size 	newImgSize = Size(),
	Rect * 	validPixROI = 0,
	bool 	centerPrincipalPoint = false 
)		

参数

  • 参数cameraMatrix:输入的相机内参矩阵。

  • 参数distCoeffs:输入的畸变系数向量,包含4、5、8、12或14个元素,具体为 (k1, k2, p1, p2 [,k3 [,k4, k5, k6 [,s1, s2, s3, s4 [,τx, τy]]]])。如果该向量为空,则假定畸变系数为零。

  • 参数imageSize:原始图像尺寸。

  • 参数alpha:自由缩放参数,范围在0到1之间。当值为0时,表示去畸变后的图像中所有像素都是有效的;当值为1时,表示保留所有原始图像的像素在去畸变后的图像中。详细信息请参见 stereoRectify 函数。

  • 参数newImgSize:校正后的图像尺寸,默认情况下设置为与 imageSize 相同。

  • 参数validPixROI:可选输出矩形,用于勾勒出去畸变后图像中所有有效像素的区域。详见 stereoRectify 中对 roi1, roi2 的描述。

  • 参数centerPrincipalPoint:可选标志,指示在新的相机内参矩阵中主点是否应位于图像中心。默认情况下,主点被选择以最佳匹配由 alpha 确定的源图像子集到校正后的图像。

返回值

Mat: 返回一个新的相机内参矩阵,用于后续的图像校正操作。

使用场景

此函数通常用于相机校正过程中,特别是在需要考虑畸变修正和图像缩放的情况下。通过调整 alpha 参数,用户可以在保持最大图像内容和去除畸变效果之间找到平衡。此外,validPixROI 参数可以帮助用户确定校正后的图像中哪些部分是有效的,这对于后续处理非常有用。

代码示例

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

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
    // 假设我们有一个已知的相机内参矩阵和畸变系数
    Mat cameraMatrix = ( Mat_< double >( 3, 3 ) << 7.084139736588365e+02, 0., 3.204250562647506e+02, 0., 7.074203328293730e+02, 2.403567949581026e+02, 0., 0., 1. );
    Mat distCoeffs   = ( Mat_< double >( 5, 1 ) << -0.354293598218628, 0.140998754697895, 0., 0., 0. );

    // 获取最优的新相机内参矩阵
    Size imageSize( 640, 480 );
    double alpha = 1.0;  // 保留所有原始图像像素
    Rect validPixROI;
    Mat newCameraMatrix = getOptimalNewCameraMatrix( cameraMatrix, distCoeffs, imageSize, alpha, Size(), &validPixROI, false );

    // 打印结果
    cout << "Original Camera Matrix:\n" << cameraMatrix << endl;
    cout << "New Camera Matrix:\n" << newCameraMatrix << endl;
    cout << "Valid Pixel ROI:\n" << validPixROI << endl;

    return 0;
}

运行结果

bash 复制代码
Original Camera Matrix:
[708.4139736588365, 0, 320.4250562647506;
 0, 707.420332829373, 240.3567949581026;
 0, 0, 1]
New Camera Matrix:
[621.6445970207091, 0, 320.5951912875612;
 0, 620.6724433749677, 240.4455924518297;
 0, 0, 1]
Valid Pixel ROI:
[607 x 439 from (16, 20)]
相关推荐
向宇it2 小时前
【unity组件介绍】URP Decal Projector贴花投影器,将特定材质(贴花)投影到场景中的其他对象上。
游戏·3d·unity·c#·游戏引擎·材质
逐云者1239 小时前
3D Gaussian Splatting (3DGS) 从入门到精通:安装、训练与常见问题全解析
3d·问题·三维重建·高斯泼溅·编译运行
工业3D_大熊9 小时前
HOOPS SDK赋能PLM:打造全生命周期3D数据管理与协作能力
3d·3d web轻量化·3d模型格式转换·3d渲染·3d模型可视化·工业3d·3d模型渲染
海绵波波10713 小时前
opencv、torch、torchvision、tensorflow的区别
人工智能·opencv·tensorflow
小新11017 小时前
3d max 的快捷键
3d
顾随18 小时前
(三)OpenCV——图像形态学
图像处理·人工智能·python·opencv·计算机视觉
zhongqu_3dnest18 小时前
VR全景园区:开启智慧园区新时代
3d·三维建模·3d楼盘
zhongqu_3dnest21 小时前
什么是3D楼盘?
3d·三维建模·房地产·房产营销·3d楼盘·线上看房
top_designer1 天前
3D材质总监的“光影魔法”:用Substance Sampler AI,“擦除”照片中的光影
人工智能·3d·新媒体运营·aigc·游戏程序·材质·材质设计师
中科米堆1 天前
中科米堆CASAIM手持式三维扫描仪金属铸件三维扫描测量方案
人工智能·3d·自动化·视觉检测