如何在不复制两个数据的情况下在opencv中连接mat

如何在不复制两个数据的情况下在opencv中连接mat,opencv,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,

我想浓缩很多图像,每次用一个图像浓缩到前一个浓缩图像。 现在我这样实现它:

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会被调用多次,但我不知道advanced的号码,每次调用时,我都必须返回contactedImage。因此,我不能缓冲所有的图像,而malloc outImg只是一次

正如上面的代码所示,每次我都必须将左图像和右图像复制到outImg


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

mat的数据以连续数组的形式存储在内存中,顺序如下:

第1行+第2行+第3行

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

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

因此,在适当的位置增加图像的列是不可能的

增加列的数量可能是可行的,但是我不知道有任何opencv方法可以做到这一点

但是像您这样水平连接图像将意味着增加列的数量,因此这无论如何都没有帮助

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