这个例子说明了如何使用estimateFundamentalMatrix
,estimateUncalibratedRectification
和detectSURFFeatures
函数来计算两个未经校准的图像,其中照相机内函数是未知的整流。
立体图像校正投影图像到公共图像平面以这样的方式使相应的点具有相同的行坐标。这个过程是对立体视觉是有用的,因为2-d立体对应问题减小到1-d问题。作为一个例子,立体图像整流常被用作用于预处理步骤计算差距或创建浮雕图像。
阅读在同一场景中,这是从不同的位置拍摄的两种颜色的图像。然后,将它们转换为灰度。颜色是不需要的匹配过程。
I1 = imread('yellowstone_left.png');I2 = imread('yellowstone_right.png');%转换为灰度。I1gray = rgb2gray(I1);I2gray = rgb2gray(I 2);
显示由侧两个图像侧。然后,显示彩色合成证明的图像之间的像素方面的差异。
数字;imshowpair(I1,I2,'剪辑');标题(“I1(左);I2(右)”);数字;imshow(stereoAnaglyph(I1,I2));标题(“合成图像(红 - 左图像,青色 - 右图)”);
有一个明显的方向和位置的图像之间的偏移。整治的目标是把图像,对准它们,这样对应的点会出现在两个图像相同的行。
精馏过程需要一组两个图像之间的对应点的。产生这些信件,你将收集来自两个图像的兴趣点,然后选择它们之间可能的匹配。用detectSURFFeatures
找到两个图像斑点状特征。
blobs1 = detectSURFFeatures(I1gray,'MetricThreshold',2000);blobs2 = detectSURFFeatures(I2gray,'MetricThreshold',2000);
可视化的I1和I2三十最强SURF特征的位置和规模。注意,并不是所有的检测到的特征可以,因为他们要么没有在两个图像中检测到的,或者因为它们中的一些是不存在于图像中的一个由于照相机运动相匹配。
数字;imshow(I1);保持上;情节(selectStrongest(blobs1,30));标题(“在I1三十最强的SURF功能”);数字;imshow(I2);保持上;情节(selectStrongest(blobs2,30));标题(“在I2三十最强的SURF功能”);
使用extractFeatures
和matchFeatures
功能找到假定对应点。对于每一个斑点,计算SURF特征向量(描述符)。
[功能1,validBlobs1] = extractFeatures(I1gray,blobs1);[功能2,validBlobs2] = extractFeatures(I2gray,blobs2);
使用的绝对差值(SAD)指标来确定的匹配特征指数的总和。
indexPairs = matchFeatures(功能1,功能2,“公制”,'伤心',...'MatchThreshold',5);
检索每个图像相匹配的点的位置。
matchedPoints1 = validBlobs1(indexPairs(:,1),:);matchedPoints2 = validBlobs2(indexPairs(:,2),:);
上的复合图像,它结合了立体图像的顶部示出的匹配点。请注意,大多数比赛都是正确的,但仍存在一些异常值。
数字;showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2);传说(“推定匹配的I1点”,“推定的匹配在I2点”);
正确的匹配点必须满足极线约束。这意味着,一个点必须位于极线被其相应的点来确定。您将使用estimateFundamentalMatrix
函数来计算基础矩阵,并找到满足极线约束的正常值。
[fMatrix,epipolarInliers,状态] = estimateFundamentalMatrix(...matchedPoints1,matchedPoints2,'方法','RANSAC',...'的numtrials',10000,'DistanceThreshold',0.1%,'置信度',99.99);如果状态〜= 0 ||isEpipoleInImage(fMatrix,大小(I1))...||isEpipoleInImage(fMatrix”,大小(I 2))错误([“要么不被发现或足够的匹配点”...“的核点是图像内部。您可能需要“...“检查和改进的检测到的特征的品质”,...“和/或改善你的图像的质量。”]);结束inlierPoints1 = matchedPoints1(epipolarInliers,:);inlierPoints2 = matchedPoints2(epipolarInliers,:);数字;showMatchedFeatures(I1,I2,inlierPoints1,inlierPoints2);传说(“英利尔山区点I1”,“英利尔山区点I2”);
使用estimateUncalibratedRectification
函数来计算整改转型。这些可以被用来变换的图像,以使得相应的点将出现在同一行。
[T1,T2] = estimateUncalibratedRectification(fMatrix,...inlierPoints1.Location,inlierPoints2.Location,大小(I 2));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;VERRI,A“3-d计算机视觉技术的介绍。”Prentice Hall出版社,1998年。
[2]哈特利,R;Zisserman,A“多视图几何在计算机视觉。”剑桥大学出版社,2003。
[3]哈特利,R.“八点算法在防守”。IEEE®交易模式分析与机器智能,第19节N.6,1997年6月。
[4]费什勒,MA;博尔斯,RC。“随机样本共识:一个范式模型应用图像分析和自动制图配件。”通讯。的ACM 24,1981年6月。