主要内容

未校准立体图像校正

方法的使用estimateFundamentalMatrixestimateStereoRectification,detectSURFFeatures函数来计算两个未校准图像的校正,其中相机的intrinsic是未知的。

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

第一步:阅读立体图像对

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

I1 = imread(“yellowstone_left.png”);I2 = imread(“yellowstone_right.png”);%转换为灰度。I1gray = rgb2gray(I1);I2gray = rgb2gray(I2);

并排显示两个图像。然后,显示一个颜色合成,显示图像之间的像素差异。

图;imshowpair (I1、I2“蒙太奇”);标题(“I1(左);I2(右)”);

图中包含一个轴对象。axis对象的标题为I1(左);I2(右)包含一个image类型的对象。

图;imshow (stereoAnaglyph (I1、I2));标题(合成图像(红色-左图像,青色-右图像));

图中包含一个轴对象。标题为合成图像(红色-左图像,青色-右图像)的坐标轴对象包含一个图像类型的对象。

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

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

校正过程需要两幅图像之间的一组点对应关系。为了生成这些对应关系,您将从两个图像中收集感兴趣的点,然后在它们之间选择潜在的匹配。使用detectSURFFeatures在两幅图像中找到斑点状的特征。

blobs1 = detectsurffatures (I1gray,MetricThreshold=2000);blobs2 = detectsurffatures (I2gray,MetricThreshold=2000);

可视化I1和I2中30个最强SURF特征的位置和规模。请注意,并非所有检测到的特征都可以匹配,因为它们要么在两张图像中都没有检测到,要么因为由于相机运动,其中一些特征没有出现在其中一张图像中。

图;imshow (I1);持有;情节(selectStrongest (blobs1、30));标题(《I1中30个最强SURF功能》);

图中包含一个轴对象。标题为Thirty stronger SURF Features In I1的坐标轴对象包含3个类型为image、line的对象。

图;imshow (I2);持有;情节(selectStrongest (blobs2、30));标题(《I2最强的30个SURF功能》);

图中包含一个轴对象。标题为Thirty stronger SURF Features In I2的坐标轴对象包含3个类型为image、line的对象。

第三步:寻找假定点对应关系

使用extractFeatures而且matchFeatures函数来寻找假定的点对应关系。对于每个blob,计算SURF特征向量(描述符)。

[featres1,validBlobs1] = extractFeatures(I1gray,blobs1);[featres2,validBlobs2] = extractFeatures(I2gray,blobs2);

使用绝对差和(SAD)度量来确定匹配特征的指标。

indexPairs = matchFeatures(featres1, featres2,Metric=“悲伤”...MatchThreshold = 5);

检索每个图像的匹配点的位置。

matchedPoints1 = validBlobs1(indexPairs(:,1),:);matchedPoints2 = validBlobs2(indexPairs(:,2),:);

在组合立体图像的合成图像顶部显示匹配点。注意,大多数匹配都是正确的,但仍有一些异常值。

图;showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2);传奇(I1中的假定匹配点I2中的假定匹配点);

图中包含一个轴对象。axis对象包含image、line等类型的4个对象。这些对象表示I1中的假定匹配点,I2中的假定匹配点。

步骤4:使用epeppolar约束删除异常值

正确匹配的点必须满足极限条件。这意味着一个点必须位于由其对应点确定的极线上。您将使用estimateFundamentalMatrix函数来计算基本矩阵并找到满足极坐标约束的内线。

[fMatrix, epipolarInliers, status] = estimatfundamental matrix (...matchedPoints1 matchedPoints2方法=“RANSAC”...NumTrials = 10000, DistanceThreshold = 0.1,信心= 99.99);如果isepepoleinimage (fMatrix,size(I1))...|| isEpipoleInImage(fMatrix',size(I2)) error(["没有找到足够的匹配点或"...“偶极在图像内部。检查”...提高被检测特征的质量...“和图像”。]);结束inlierPoints1 = matchedPoints1(epipolarInliers,:);inlierPoints2 = matchedPoints2(epipolarInliers,:);图;showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2);传奇(I1中的Inlier点I2中的Inlier点);

图中包含一个轴对象。axis对象包含image、line等类型的4个对象。这些对象表示Inlier Points In I1, Inlier Points In I2。

步骤5:纠正图像

使用estimateStereoRectification函数来计算整流变换。这些可用于转换图像,以便相应的点将出现在相同的行上。

[tform1, tform2] = estimatestereocorrection (fMatrix,...inlierPoints1.Location inlierPoints2.Location,大小(I2));

校正立体图像,并将其显示为立体浮雕。你可以用红青色立体眼镜来观察3D效果。

[I1Rect, I2Rect] = rectifyStereoImages(I1,I2,tform1,tform2);图;imshow (stereoAnaglyph (I1Rect I2Rect));标题(校正立体图像(红-左图像,青-右图像));

图中包含一个轴对象。标题为“整流立体图像”(红色-左图像,青色-右图像)的坐标轴对象包含一个类型为Image的对象。

第六步:概括整改过程

上述步骤中使用的参数已设置为适合两个特定的立体图像。要处理其他图像,可以使用cvexRectifyStereoImages函数,其中包含自动调整整流参数的附加逻辑。下图显示了使用该函数处理一对图像的结果。

cvexRectifyImages (“parkinglot_left.png”“parkinglot_right.png”);

图中包含一个轴对象。标题为“整流立体图像”(红色-左图像,青色-右图像)的坐标轴对象包含一个类型为Image的对象。

参考文献

[1] Trucco, E;维利,A。3-D计算机视觉入门技术普伦蒂斯·霍尔,1998年。

[2]哈特利R;Zisserman,。计算机视觉中的多视图几何。剑桥大学出版社,2003年。

哈特利,R。《为八点算法辩护》IEEE模式分析与机器智能汇刊,1997年6月,第19期。

[4]费施勒,MA;葛,RC。随机样本共识:模型拟合与图像分析和自动制图应用的范例美国计算机学会通讯1981年6月24日。