我正在研究PIV-Workflow,我正在预处理图像。我需要摆脱图像中的透视失真。我有“图像处理工具箱”和“相机校准器”。我已经用“undistortImage()”摆脱了镜头失真;和cameraParams对象,通过棋盘图案推断出来。
第一个问题:是否可以使用cameraParams对象透视地扭曲图像,以便我的棋盘在图像中得到纠正?
第二个问题:由于我无法使用cameraParams对象,我尝试手动使用转换功能。我尝试使用成对的控制点(使用cpselection工具,原始图像和生成的棋盘图像)和fitgeotrans(movingPoints,fixedPoints,'projective');函数来获取我的tform-object。但是我总是收到错误消息:
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对或更多)。但我仍然遇到这个错误。我相信我必须忽视这里的一些事情。
感谢任何帮助,谢谢。
斯蒂芬
答案 0 :(得分:2)
如果您使用其中一个校准图像,那么您需要的所有信息都在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);
你应该看到一只鸟的眼睛"棋盘的视图。如果您没有使用其中一个校准图像,则可以使用R
函数计算t
和extrinsics
。
另一种方法是使用detectCheckerboardPoints
和generateCheckerboardPoints
,然后使用fitgeotform
计算单应性。