如何在opencv中连接mat而不复制两个数据

时间:2013-12-23 07:39:50

标签: opencv

我想要连接许多图像,每次将一个图像连接到先前的连接图像。 现在我像这样实现它:

cv::Mat src1;

cv::Mat concatImage(cv::Mat src2)
{
   cv::Mat outImg(src1.rows, src1.cols+src2.cols);
   cv::Mat outImg1 = outImg(cvRect(0, 0, src1.rows, src1.cols));
   cv::Mat outImg2 = outImg(cvRect(src1.cols, 0, src2.rows, src2.cols));
   src1.copyTo(outImg1);
   src2.copyTo(outImg2);

   src1 = outImg;
   return src1;
}

concatImage会被多次调用,但是我不知道它的数量是多少,每次调用它时,我都要返回contactsImage。因此,我无法缓冲所有图像,而malloc outImg只是一次。

如上面的代码所示,每次都要将左右图像复制到outImg。

我的问题是,我可以在不破坏其内容的情况下扩大垫子的尺寸,这样我只能将src2的数据复制到src1。

1 个答案:

答案 0 :(得分:0)

Mat的数据按以下顺序存储在内存中:

row1 + row2 + row3 ...

每行包含的像素数等于列数(加上一些填充)

要水平放大图像,每行需要更长。因此,所有后续行都必须在内存中移动。

因此无法就地增加图像的列。

增加列数可能是可行的,但我不知道有任何opencv方法。

但是像你一样水平连接图像意味着增加列数,所以这无论如何都无济于事。

如果可能,我建议收集要连接的所有图像,然后在知道完整尺寸后创建图像。或者,您可以在列中创建具有合理剩余的outImage,并且在用完列时仅切换到新的outImage。