主要内容

未校准的立体图像校正

这个例子展示了如何使用estimateFundamentalMatrixestimateUncalibratedRectification,detectSURFFeatures函数计算校正的两个未校准的图像,相机的本质是未知的。

立体图像校正将图像投影到一个公共的图像平面上,使相应的点具有相同的行坐标。这个过程对立体视觉很有用,因为二维立体对应问题被简化为一维问题。例如,立体图像校正经常被用作预处理步骤计算差异或创建浮雕图像。

步骤1:读取立体图像对

阅读从不同位置拍摄的同一场景的两幅彩色图像。然后,将它们转换为灰度。颜色在匹配过程中是不需要的。

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));标题(“合成图像(红-左图像,青-右图像)”);

图像在方向和位置上存在明显的偏移。校正的目标是变换图像,对它们进行对齐,使相应的点出现在两幅图像的同一行上。

步骤2:从每张图片中收集兴趣点

校正过程需要两幅图像之间的一组点对应。要生成这些通信,您将从两个图像中收集感兴趣的点,然后在它们之间选择潜在的匹配。使用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功能”);

第三步:找到假定的点对应

使用extractFeaturesmatchFeatures查找假定点对应关系的函数。对于每个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中的假定匹配点”);

步骤4:使用极线约束去除异常值

正确匹配的点必须满足极线约束。这意味着一个点必须位于由其对应点所确定的极线上。你可以使用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”);

步骤5:矫正图像

使用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));标题(“校正立体图像(左红色图像,右青色图像)”);

步骤6:归纳整流过程

上述步骤中使用的参数已被设置为适合两个特定的立体图像。要处理其他图像,可以使用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日。