未经校准的立体图像校正
控件的实例estimateFundamentalMatrix
,estimateUncalibratedRectification
,detectSURFFeatures
函数计算校正两个未校准的图像,其中相机的本质是未知的。
立体图像校正将图像投影到公共图像平面上,使相应的点具有相同的行坐标。这个过程对立体视觉很有用,因为二维立体对应问题被简化为一维问题。例如,立体图像校正常被用作图像的预处理步骤计算差异或者创建浮雕图像。
第一步:阅读立体图像对
读取从不同位置拍摄的同一场景的两张彩色图像。然后,将它们转换为灰度。配色过程不需要颜色。
i = imread()“yellowstone_left.png”);I2 = imread“yellowstone_right.png”);%转换为灰度。I1gray = rgb2gray(I1);I2gray = rgb2gray(I2);
并排显示两个图像。然后,显示一个颜色合成,演示图像之间逐像素的差异。
图;imshowpair (I1、I2“蒙太奇”);标题(I1(左);I2(右));图;imshow (stereoAnaglyph (I1、I2));标题(“合成图像(左图红色,右图青色)”);
图像在方向和位置上有明显的偏移。校正的目的是变换图像,将它们对齐,使对应的点出现在两幅图像的同一行上。
步骤2:从每个图像中收集兴趣点
校正过程需要两幅图像之间的一组点对应。为了生成这些对应关系,您将从两个图像中收集感兴趣的点,然后在它们之间选择潜在的匹配。使用detectSURFFeatures
在两幅图像中找到类似斑点的特征。
blobs1 = detectsurfeatures (I1gray,“MetricThreshold”, 2000);blobs2 = detectsurfeatures (I2gray,“MetricThreshold”, 2000);
可视化I1和I2中30个最强SURF特征的位置和规模。请注意,并非所有检测到的特征都可以匹配,因为它们要么在两幅图像中都没有检测到,要么因为其中一些特征由于相机运动而没有出现在其中一幅图像中。
图;imshow (I1);持有在;情节(selectStrongest (blobs1、30));标题(“30个最强的冲浪功能在11”);图;imshow (I2);持有在;情节(selectStrongest (blobs2、30));标题(“30个最强的冲浪功能在I2”);
步骤3:找到假定的点对应
使用extractFeatures
和matchFeatures
查找假定的点对应的函数。对于每个blob,计算SURF特征向量(描述符)。
[features1, validBlobs1] = extractFeatures(I1gray, blobs1);[features2, validBlobs2] = extractFeatures(I2gray, blobs2);
使用绝对差值和(SAD)度量来确定匹配特征的指标。
indexPairs = matchFeatures(features1, features2,“指标”,“伤心”,…“MatchThreshold”5);
检索匹配点的位置为每个图像。
matchedPoints1 = validBlobs1(indexPairs(:,1),:);matchedPoints2 = validBlobs2(indexPairs(:,2),:);
在合成图像的顶部显示匹配点,从而结合立体图像。请注意,大多数匹配是正确的,但仍有一些异常值。
图;showMatchedFeatures(1, 2, matchedPoints1, matchedPoints2);传奇(“I1中的假定匹配点”,“I2中假定匹配的点”);
步骤4:使用Epipolar约束去除异常值
正确匹配的点必须满足极外约束。这意味着一个点必须位于由其对应点确定的极线上。您将使用estimateFundamentalMatrix
函数来计算基本矩阵,并找到满足极坐标约束的内层。
[fMatrix, eppolarinliers, status] = estimatfundalmatrix (…matchedPoints1 matchedPoints2,“方法”,“RANSAC”,…“NumTrials”, 10000,“DistanceThreshold”, 0.1,“信心”, 99.99);如果isEpipoleInImage(fMatrix, size(I1))…|| isEpipoleInImage(fMatrix', size(I2)) error([]"要么没有找到足够的匹配点,要么"…“磁极在图像内部。你可能需要。…检查并改进检测到的特征的质量,…和/或提高你的图像质量。]);结束inlierPoints1 = matchedPoints1(epipolarInliers,:);inlierPoints2 = matchedPoints2(epipolarInliers,:);图;showMatchedFeatures(1, 2, inlierPoints1, inlierPoints2);传奇(“在11点之前”,“I2的早期点”);
步骤5:纠正图像
使用estimateUncalibratedRectification
函数来计算整流变换。这些可以用来变换图像,使相应的点出现在同一行上。
[t1, t2] = estimateuncalibratedrectifier (fMatrix,…inlierPoints1。位置,inlierPoints2。位置、大小(I2));Tform1 = projective2d(t1);Tform2 = projective2d(t2);
校正立体图像,并将其显示为立体浮雕。你可以用红青色立体眼镜看3D效果。
[I1Rect, I2Rect] = rectifyStereoImages(I1, I2, tform1, tform2);图;imshow (stereoAnaglyph (I1Rect I2Rect));标题(校正立体图像(红色-左图像,青色-右图像));
第六步:概括整改过程
上述步骤中使用的参数已设置为适合两个特定的立体图像。要处理其他图像,可以使用cvexRectifyStereoImages
函数,其中包含额外的逻辑来自动调整整流参数。下图显示了使用该函数处理一对图像的结果。
cvexRectifyImages (“parkinglot_left.png”,“parkinglot_right.png”);
参考文献
[1]卡车,E;维利,A。3-D计算机视觉入门技术。普伦蒂斯·霍尔,1998年。
[2]哈特利R;Zisserman,。计算机视觉中的多视图几何。剑桥大学出版社,2003。
[3]哈特利,R。"为八点算法辩护"模式分析与机器智能学报,vol .19 n.6, 1997。
[4] fischer, MA;葛,RC。随机样本共识:模型拟合与图像分析和自动制图应用的范例。1981年6月24日,美国计算机协会会议公报。