Opencv调整针的大小

Posted

技术标签:

【中文标题】Opencv调整针的大小【英文标题】:Opencv Resize a stitch 【发布时间】:2015-03-25 08:05:37 【问题描述】:

我正在使用 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 图像?

编辑 抱歉,我不得不删除图片

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

嗨!在每一个缝合步骤,我都会用刚刚缝合的图像更新参考图像,所以我想我就是你所说的漂移。如果我是这种情况,我该如何解决?对于第一个问题,我会尽量按照你说的做,如果有效,我会告诉你! 如果以拼接后的图像为参考,在某些情况下也可能会丢失一些信息(因为插值引入的模糊,或者拼接结果与当前帧之间的比例差异)。另一种可能性(可能质量更高但开发开销更大)是在第一遍中计算所有单应性,然后同时寻找从所有输入帧优化的拼接图像。 嗯我明白,但我不能这样做,因为它是一个流,而不是电脑上的视频文件。现在我正在尝试调整针迹的大小,如果我成功了我会告诉你. .感谢您的快速回复! 嗨!很抱歉,你能告诉我如何追踪针迹的边界或我必须看的地方吗?我对opencv很陌生,所以我不太了解框架! 你必须(大部分)自己做。图像到图像的变换以单应性 H 的形式出现。此单应性应用于新帧中的每个像素坐标以给出其拼接坐标,只需使用 (u,v)^T = H * (x,y)^T .每当你得到一个新的框架时,通过检查 (u,v) 坐标是在前一个边界框的内部还是外部来更新拼接结果的边界框。将边界框初始化为第一个框架框(因为它没有被转换)。

以上是关于Opencv调整针的大小的主要内容,如果未能解决你的问题,请参考以下文章

使用 opencv 在 GPU 上调整图像大小会产生空输出矩阵

使OpenCV框架不可调整大小

如何在 OpenCV 中将图像调整为特定大小?

如何使用opencv集中和调整数字大小?

OpenCV:自动将窗口大小调整为显示的图像

为啥在 OpenCv 中调整图像大小会降低相机校准的重投影误差?