5

我正在做一个项目,将撕碎的纸片合并成一个图像。到目前为止,我已经完成了寻找轮廓并找到匹配件的预处理。

我得到 2 个匹配但位于单独的 2 个cv::Mat对象中的图像。

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

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

4

1 回答 1

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)));

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

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 方向上的移动来完成,但它需要更多的计算,比如估计多边形的边界框

于 2014-03-28T06:39:29.980 回答