0

我正在用 Opencv 中的视频制作马赛克。我正在使用这个例子来拼接视频的帧:http: //docs.opencv.org/doc/tutorials/features2d/feature_detection/feature_detection.html。最后,我这样做是为了将新框架与在通过的迭代中创建的针迹合并:

Mat H = findHomography(obj, scene, CV_RANSAC);

static Mat rImg;
warpPerspective(vImg[0], rImg, H, Size(vImg[0].cols, vImg[0].rows), INTER_NEAREST);//(vImg[0], rImg, H, Size(vImg[0].cols * 2, vImg[0].rows * 2), CV_INTER_LINEAR);

static Mat final_img(Size(rImg.cols*2, rImg.rows*2), CV_8UC3);
static Mat roi1(final_img, Rect(0, 0, vImg[1].cols, vImg[1].rows));
Mat roi2(final_img, Rect(0, 0, rImg.cols, rImg.rows));

rImg.copyTo(roi2);
vImg[1].copyTo(roi1);

imwrite("stitch.jpg", final_img);
vImg[0] = final_img;

所以这是我的问题:显然每次迭代时针迹都会变大,那么我该如何调整它的大小以使其适合final_img图像?

编辑 对不起,但我不得不删除图像

4

1 回答 1

0

对于第二个问题,您观察到的是估计的单应性错误。这可能来自:

  1. 漂移(如果您沿着序列链接单应性),即在数十帧后累积并变大的小错误
  2. 或者(更有可能)因为您的参考图像相对于您的新图像来说太旧了,并且它们显示的匹配点太少而无法提供准确的单应性,但足以找到通过内部质量测试的图像cv::findHomography()

对于您的第一个问题,您需要添加一些代码来跟踪固定坐标系中拼接图像的当前边界。我建议选择与第一张图片链接的坐标。

然后,当你拼接一个新图像时,你真正要做的就是将这个图像投影到这个坐标系上。例如,您可以首先计算传入帧的 4 个角的投影坐标,测试它们是否适合当前的拼接结果,如有必要,将其复制到新的(更大的)图像,然后继续拼接新图像。

于 2015-03-25T08:26:02.123 回答