如何在不复制两个数据的情况下在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