0

我们正在尝试不断地处理两个相机捕获的图像帧,每两帧处理一次,然后将它们拼接以获得完整的视图。为了做到这一点,我们有 1.extracted surf 特征。2.使用 Flann Matcher 得到两个图像之间的匹配。3.使用这些匹配计算单应矩阵。4.在右图上应用warpPerspective。

//To get the surf keypoints and descriptors:

cuda::SURD_CUDA surf(700);
surf(leftImgGpu, cuda::GpuMat(), keyPointsGpuA, descriptorsAGpu);
surf(rightImgGpu, cuda::GpuMat(), keyPointsGpuB, descriptorsBGpu);
surf.downloadKeypoints(keypointsAGpu, keypoiintsA);
surf.downloadKeypoints(keypointsBGpu, keypoiintsB);

//Flann based matcher:
FlannBasedMatcher matcher(new cv::flann::KDTreeIndexParams(4), new 
cv::flann::SearchParams())

//To get the homography matrix:
vector<Point2f> imgPtsA, imgPtsB;
for(int i=0;i<matches.size();i++){
    imgPtsB.push_back(keypointsB[matches[i].queryIdx].pt);
    imgPtsA.push_back(keypointsA[matches[i].trainIdx].pt);
}
Mat H=findHomography(imgPtsA, imgPtsB, CV_RANSAC);
 
//To a warp right image:
warpPerspective(rightImg, warpRight, H, rightImg.size());

我们有两个问题: 问题 1:扭曲的图像3正在移动。左右摄像头是固定的,我们正在处理的图像()每次都几乎相同。我们怀疑匹配和单应矩阵存在一些问题,因为扭曲的图像没有正确出现。问题 2:我们最初使用 BF Matcher 来获取匹配项。当使用这些匹配构建 Homography 垫时,我们得到了奇怪的结果。使用基于 Flann 的匹配器后,结果相对更好。

4

1 回答 1

1

要通过拼接创建适当的“全景”图像,相机需要几乎位于空间中的相同位置,否则会出现视差错误(参见此处)。在一般情况下,单应性只能扭曲图像中的单个平面,以便将其与其挂件注册。因此,例如可以只缝合地板(当然,如果它为特征提供了足够的纹理)。

所以,你不能指望一个稳定的结果,因为单应性不能模拟这种转换。更形象:椅子的前侧仅在右图中可见,因此无法将该区域与左图“匹配”。

于 2017-12-12T16:27:11.167 回答