主要内容

本页采用了机器翻译。点击此处可查看英文原文。

undistortImage

校正镜头畸变后的图像

说明

[J,camIntrinsics] = undistortImage(I,intrinsics) 使用在 intrinsics 中定义的相机参数,对输入图像 I 进行镜头畸变校正。该函数返回校正后的图像 J 以及未去畸变的相机内参 camIntrinsics

示例

[J,camIntrinsics] = undistortImage(I,intrinsics,interp) 指定了该函数在处理输入图像时应采用的插值方法。

[J,camIntrinsics] = undistortImage(___,Name=Value) 支持上述语法中的任何参量组合,且可使用一个或多个名称-值参量指定选项。例如,(FillValues=[0 0.4470 0.7410]) 会将位于输入图像边界之外的输出像素值设置为蓝色。

示例

全部折叠

创建一组标定图像。

images = imageDatastore(fullfile(toolboxdir("vision"),"visiondata", ...
    "calibration","mono"));

检测标定图案。

[imagePoints,patternDims] = detectCheckerboardPoints(images.Files);

生成正方形各角点的世界坐标。正方形的尺寸以毫米为单位。

squareSize = 29; % millimeters
worldPoints = patternWorldPoints("checkerboard",patternDims,squareSize);

标定相机。

I = readimage(images,1); 
imageSize = size(I,1:2);
cameraParams = estimateCameraParameters(imagePoints,worldPoints,ImageSize=imageSize);

消除镜头畸变并显示结果。

I = images.readimage(1);
J1 = undistortImage(I,cameraParams);
figure; 
imshowpair(I,J1,"montage");
title("Original Image (left) vs. Corrected Image (right)");

Figure contains an axes object. The hidden axes object with title Original Image (left) vs. Corrected Image (right) contains an object of type image.

J2 = undistortImage(I,cameraParams,OutputView="full");
figure; 
imshow(J2);
title("Full Output View");

Figure contains an axes object. The hidden axes object with title Full Output View contains an object of type image.

创建一个包含标定图像的 imageDatastore 对象。

images = imageDatastore(fullfile(toolboxdir("vision"),"visiondata", ...
   "calibration","mono"));
imageFileNames = images.Files;

检测标定图案。

[imagePoints,patternDims] = detectCheckerboardPoints(imageFileNames);

生成正方形各角点的世界坐标。正方形的尺寸以毫米为单位。

squareSize = 29; % millimeters
worldPoints = patternWorldPoints("checkerboard",patternDims,squareSize);

标定相机。

I = readimage(images,10); 
imageSize = [size(I, 1), size(I, 2)];
params = estimateCameraParameters(imagePoints,worldPoints,ImageSize=imageSize);
intrinsics = params.Intrinsics;

加载一个图像并检测棋盘格上的点。

points = detectCheckerboardPoints(I);

对点进行去畸变

undistortedPoints = undistortPoints(points,intrinsics);

去畸变图像。

[J, newIntrinsics] = undistortImage(I,intrinsics,OutputView="full");

平移去畸变的点

newOrigin = intrinsics.PrincipalPoint - newIntrinsics.PrincipalPoint;
undistortedPoints = [undistortedPoints(:,1) - newOrigin(1), ...
                     undistortedPoints(:,2) - newOrigin(2)];

显示结果

figure; 
imshow(I); 
hold on;
plot(points(:,1),points(:,2),"r*-");
title("Detected Points"); 
hold off;

Figure contains an axes object. The hidden axes object with title Detected Points contains 2 objects of type image, line.

figure; 
imshow(J); 
hold on;
plot(undistortedPoints(:,1),undistortedPoints(:,2),"g*-");
title("Undistorted Points"); 
hold off;

Figure contains an axes object. The hidden axes object with title Undistorted Points contains 2 objects of type image, line.

输入参数

全部折叠

输入图像,格式为 M×N×3 真彩色 或 M×N 二维灰度。输入图像必须为非稀疏实矩阵。

数据类型: single | double | int16 | uint8 | uint16 | logical

相机内参,指定为 cameraParameterscameraIntrinsicscameraIntrinsicsKB 对象。

对输入图像使用的插值方法,指定为 "linear""nearest""cubic"

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: (FillValues=[0 0.4470 0.7410]) 将超出输入图像边界的输出像素值设置为蓝色。

输出像素填充值,指定为包含一个或多个填充值的数组。当输入图像中对应于逆变换器位置的区域完全位于输入图像边界之外时,应使用填充值作为输出像素的值。当使用二维灰度输入图像时,必须将 FillValues 设置为标量。当使用真彩色时,FillValues 可以是标量,也可以是包含 RGB 值的 3 个元素向量。

输出图像的大小,指定为 "same""full""valid"。当您将该属性设置为 "same" 时,该函数会将输出图像的尺寸调整为与输入图像的尺寸一致。将该属性设置为 "full" 时,输出将包含输入图像中的所有像素。当您将该属性设置为 "valid" 时,该函数会裁剪输出图像,使其仅包含有效的像素。

对于输入图像:

OutputView输出图像
"same"

调整为与输入图像相同的尺寸。

"full"

输入图像中的所有像素。

"valid"

仅包含输入图像中的有效像素。

输出参量

全部折叠

未去畸变的图像,以 M×N×3 真彩色或 M×N 二维灰度格式返回。

数据类型: single | double | int16 | uint8 | uint16 | logical

相机内参,以 cameraIntrinsics 对象的形式返回。该对象包含相机的内参和镜头畸变系数,用于生成已消除镜头畸变的输出图像。

建议在任何使用未去畸变图像 J 的摄影测量应用中使用 camIntrinsics 输出,例如立体相机标定、多相机标定、激光雷达-相机标定、三角剖分以及类似任务。

扩展功能

全部展开

版本历史记录

在 R2014a 中推出

全部展开