我想要连接许多图像,每次将一个图像连接到先前的连接图像。 现在我像这样实现它:
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。
答案 0 :(得分:0)
Mat的数据按以下顺序存储在内存中:
row1 + row2 + row3 ...
每行包含的像素数等于列数(加上一些填充)
要水平放大图像,每行需要更长。因此,所有后续行都必须在内存中移动。
因此无法就地增加图像的列。
增加列数可能是可行的,但我不知道有任何opencv方法。
但是像你一样水平连接图像意味着增加列数,所以这无论如何都无济于事。
如果可能,我建议收集要连接的所有图像,然后在知道完整尺寸后创建图像。或者,您可以在列中创建具有合理剩余的outImage,并且在用完列时仅切换到新的outImage。