在OpenCV中将两张撕碎的纸片合并为一张图像

时间:2014-03-27 23:36:17

标签: c++ opencv image-processing image-stitching

我正在开展一个项目,将撕碎的纸片合并为一个图像。 直到现在我已经完成预处理以找到轮廓并找到匹配的部分。

我得到了2张匹配但分别位于2 cv::Mat个对象中的图片。

现在,我需要将这两张图片合并为一张图片。这样做的一种方法是将两个图像逐个像素地复制到新图像中,但这将是非常昂贵且处理器昂贵的。

我需要一个OpenCV库函数或具有类似功能的解决方法来完成这项工作。

1 个答案:

答案 0 :(得分:3)

您可以使用openCV的copyTo功能。例如,假设piece1和piece2是两张纸的图像:

Mat twoPieces (piece1.rows, 2*piece1.cols, piece1.type());
piece1.copyTo (twoPieces(Rect(0, 0, piece1.cols, piece1.rows)));
piece2.copyTo (twoPieces(Rect(piece1.cols, 0, piece2.cols, piece2.rows)));

我在这里假设图像大小相同,但如果不是,则可以更新代码。上面的例子也显示了如何复制整个图像。您可以定义蒙版并仅复制带有纸张的位置。要绘制蒙版,您可以使用polylines

Mat mask1(piece1.size(), CV_8U, Scalar(0));
polylines(mask1, piece1Contours, true, 255, CV_FILLED);
piece1.copyTo (twoPieces(Rect(0, 0, piece1.cols, piece1.rows)), mask1);

当然,如果您知道纸张之间的偏移,您可以更改Rect中的原点,以便两个部分彼此相邻。

Mat mask2(piece2.size(), CV_8U, Scalar(0));
polylines(mask2, piece2Contours, true, 255, CV_FILLED);
piece2.copyTo (twoPieces(Rect(dx, 0, piece2.cols, piece2.rows)), mask2);

我再一次简化了这个例子,假设换档仅在X方向。它可以在X和Y方向上进行移位,但需要更多的计算,例如估计多边形的bounding box