Image 用Matlab'对图像进行校正;s";camerParams“;(计算机视觉系统工具箱)

Image 用Matlab'对图像进行校正;s";camerParams“;(计算机视觉系统工具箱),image,matlab,camera-calibration,matlab-cvst,distortion,Image,Matlab,Camera Calibration,Matlab Cvst,Distortion,我正在进行PIV工作流程,目前正在对图像进行预处理。我需要消除图像中的透视失真。我有“图像处理工具箱”和“摄像机校准器”。我已经用“unortimage();”和cameraParams对象消除了镜头失真,这是通过棋盘模式推断出来的 第一个问题:是否可以使用cameraParams对象透视扭曲图像,以便在图像中纠正我的棋盘 第二个问题:因为我无法使用cameraParams对象,所以我尝试手动使用转换函数。我尝试使用成对的控制点(使用cpselection工具、原始图像和生成的棋盘图像)和fit

我正在进行PIV工作流程,目前正在对图像进行预处理。我需要消除图像中的透视失真。我有“图像处理工具箱”和“摄像机校准器”。我已经用“unortimage();”和cameraParams对象消除了镜头失真,这是通过棋盘模式推断出来的

第一个问题:是否可以使用cameraParams对象透视扭曲图像,以便在图像中纠正我的棋盘

第二个问题:因为我无法使用cameraParams对象,所以我尝试手动使用转换函数。我尝试使用成对的控制点(使用cpselection工具、原始图像和生成的棋盘图像)和fitgeotrans(移动点、固定点、“投影”);函数获取我的tform对象。但是,我总是收到错误消息:

Error using fitgeotrans>findProjectiveTransform (line 189)
At least 4 non-collinear points needed to infer projective transform.
Error in fitgeotrans (line 102)
        tform = findProjectiveTransform(movingPoints,fixedPoints);
我尝试了很多不同的控制点对(4对或更多)。但我还是有这个错误。我想我一定忽略了一些事情

非常感谢您的帮助,谢谢


Stephan

如果您正在使用其中一个校准图像,那么您需要的所有信息都在
cameraParams
对象中

假设您正在使用校准图像1,我们将其称为
I
。 首先,取消对图像的扭曲:

I = undistortImage(I, cameraParams);
获取图像的外部特征(旋转和平移):

R = cameraParams.RotationMatrices(:,:,1);
t = cameraParams.TranslationVectors(1, :);
然后将旋转和平移合并为一个矩阵:

R(3, :) = t;
现在计算棋盘格和图像平面之间的单应性:

H = R * cameraParams.IntrinsicMatrix;
使用单应性的倒数变换图像:

J = imwarp(I, projective2d(inv(H)));
imshow(J);
您应该可以看到棋盘的“鸟瞰”视图。如果未使用其中一个校准图像,则可以使用
Exterinsics
功能计算
R
t


另一种方法是使用
detectCheckerboardPoints
generateCheckerboardPoints
,然后使用
fitgeotform

计算单应性第一个问题:获取cameraParams的唯一原因是不破坏图像。因此,它不仅是可能的,而且是“强制性的”。第二:看来你给出的点是一条直线,它们应该是非共线的!谢谢1:是的,我也是这么想的。为了得到镜头畸变,Matlab必须在内部进行一些透视校正。然而,我找不到一种方法来将这种校正应用于图像。“Unsortimage()”只是进行镜头校正。2.:我的点排列在矩形或菱形中,因此实际上不是直线。所以这个错误让我有点困惑…这里是方程式:非常感谢。我刚试过,效果很好。竖起大拇指!