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

KiK*_*Mak 5 c++ opencv image-processing image-stitching

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

我得到2张匹配的图像,但是在单独的2个cv::Mat对象中.

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

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

Mic*_*nov 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)));
Run Code Online (Sandbox Code Playgroud)

我在这里假设图像大小相同,但如果大小不同,您可以更新代码。上面的示例还展示了如何复制整个图像。您可以定义遮罩并仅复制有纸片的地方。要绘制蒙版,您可以使用折线。

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);
Run Code Online (Sandbox Code Playgroud)

当然,如果您知道纸张之间的偏移,则可以更改 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);
Run Code Online (Sandbox Code Playgroud)

我再次简化了示例,假设移位仅在 X 方向上。它可以通过 X 和 Y 方向的移动来完成,但需要更多的计算,例如估计多边形的边界框。