这个例子展示了如何使用estimateFundamentalMatrix
,estimateUncalibratedRectification
,detectSURFFeatures
函数计算校正的两个未校准的图像,相机的本质是未知的。
立体图像校正将图像投影到一个公共的图像平面上,使相应的点具有相同的行坐标。这个过程对立体视觉很有用,因为二维立体对应问题被简化为一维问题。例如,立体图像校正经常被用作预处理步骤计算差异或创建浮雕图像。
阅读从不同位置拍摄的同一场景的两幅彩色图像。然后,将它们转换为灰度。颜色在匹配过程中是不需要的。
I1 = imread (“yellowstone_left.png”);I2 = imread (“yellowstone_right.png”);%转换为灰度。I1gray = rgb2gray (I1);I2gray = rgb2gray (I2);
并排显示两个图像。然后,显示一个颜色组合,显示图像之间的像素差异。
图;imshowpair (I1、I2“蒙太奇”);标题(I1(左);I2(右));图;imshow (stereoAnaglyph (I1、I2));标题(“合成图像(红-左图像,青-右图像)”);
图像在方向和位置上存在明显的偏移。校正的目标是变换图像,对它们进行对齐,使相应的点出现在两幅图像的同一行上。
校正过程需要两幅图像之间的一组点对应。要生成这些通信,您将从两个图像中收集感兴趣的点,然后在它们之间选择潜在的匹配。使用detectSURFFeatures
在两幅图像中找到斑点状的特征。
blobs1 = detectSURFFeatures (I1gray,“MetricThreshold”, 2000);blobs2 = detectSURFFeatures (I2gray,“MetricThreshold”, 2000);
在I1和I2中可视化30个最强的SURF特征的位置和规模。注意,并不是所有检测到的特征都能被匹配,因为它们要么在两幅图像中都没有被检测到,要么因为摄像机运动导致其中一些特征不在其中一张图像中。
图;imshow (I1);持有在;情节(selectStrongest (blobs1、30));标题(“I1中最强大的30个SURF功能”);图;imshow (I2);持有在;情节(selectStrongest (blobs2、30));标题(“I2中最强大的30个SURF功能”);
使用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(I1, I2, matchedPoints1, matchedPoints2);传奇(“假定的I1匹配点”,“I2中的假定匹配点”);
正确匹配的点必须满足极线约束。这意味着一个点必须位于由其对应点所确定的极线上。你可以使用estimateFundamentalMatrix
函数计算基本矩阵,并找到满足极线约束的嵌线。
[fMatrix, epipolarInliers, status] = estimateFundamentalMatrix(...matchedPoints1 matchedPoints2,“方法”,“RANSAC”,...“NumTrials”, 10000,“DistanceThreshold”, 0.1,“信心”, 99.99);如果status ~= 0 || isEpipoleInImage(fMatrix, size(I1))...|| isEpipoleInImage(fMatrix', size(I2)) error([要么没有找到足够的匹配点要么...“磁偶极子在图像里面。你可能需要...“检查并改进已检测特征的质量”,...“和/或提高你的图像质量。”]);结束inlierPoints1 = matchedPoints1(epipolarInliers,:);inlierPoints2 = matchedPoints2(epipolarInliers,:);图;showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2);传奇(“I1的Inlier points”,“I2的Inlier points”);
使用estimateUncalibratedRectification
函数来计算整流转换。这些可以用来转换图像,使相应的点出现在相同的行上。
[t1, t2] = estimateuncalibratedcorrection (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] Trucco E;维利,A。3-D计算机视觉入门技术普伦蒂斯霍尔,1998年。
[2]哈特利,R;Zisserman,。计算机视觉中的多视图几何。剑桥大学出版社,2003。
[3]哈特利,R。"为八点算法辩护"《模式分析与机器智能汇刊》,第19卷第6期,1997年6月。
[4] >马;葛,RC。随机样本共识:应用于图像分析和自动制图的模型拟合范例ACM通讯,1981年6月24日。