【发布时间】:2015-05-26 22:28:58
【问题描述】:
假设我有一个尺寸为 98x158x32(浮点型)的 Mat 变量 small_image。现在我想对这个图像进行零填充(即在图像中添加一个零边框)。我想在图像上方和下方添加 7 个零,在图像左右添加 12 个零。第一个想法是使用 cv copyMakeBorder(参见copyMakeBorder doc),这似乎非常适合:
int old_size[3];
old_size[0] = 98;
old_size[1] = 158;
old_size[2] = 32;
int pad_size[3];
pad_size[0] = old_size[0] + 2 * 7;
pad_size[1] = old_size[1] + 2 * 12;
pad_size[2] = old_size[2];
cv::Mat image_padded(3, pad_size, CV_32FC1, cv::Scalar(0)); //Initialize the larger Mat to 0
copyMakeBorder(small_image,image_padded,7,7,12,12,BORDER_CONSTANT,Scalar(0));
但是,此代码给出了 memcopy 错误。有人看到这里的问题吗?
post 中描述的替代方法也不起作用:
cv::Rect roi( cv::Point( 12, 7 ), small_image.size() );
small_image.copyTo( image_padded( roi ) );
它声称“断言失败 (m.dims
任何帮助实现零填充将不胜感激!
【问题讨论】:
-
copyMakeBorder 很可能不起作用,因为它是为表示图像的 2D 矩阵设计的(尽管可以是多通道的)。你这里有一个 3D 垫子。