用零填充图像

时间:2014-09-14 06:25:31

标签: c++ opencv image-processing

我正在使用C ++进行编码,并尝试将图像2调整为与图像1相同的尺寸,但我不想拉伸图像。我试图将image2复制到填充矩阵(在点0,0)。得到错误:

  

OpenCV错误:(0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows)中的断言失败Mat,文件C:\ opencv \ opencv \ modules \ core \ src \ matrix.cpp,第323行

代码如下。提前致谢

    Mat padded;
    padded.setTo(cv::Scalar::all(0));
    padded.create(image1.rows,image1.cols, image2.type());
    image2.copyTo(padded(Rect(0, 0, image2.rows, image2.cols)));

3 个答案:

答案 0 :(得分:2)

您可以使用OpenCV函数copyMakeBorder填充图像:

要实现您的目标,您可以尝试以下方法:

cv::Mat padded;

//Assuming that dimensions of image1 are larger than that of image2
//Calculate padding amount so that total size after padding is equal to image1's size
int rowPadding = image1.rows - image2.rows;
int colPadding = image1.cols - image2.cols;

cv::copyMakeBorder(image2, padded, 0, rowPadding, 0, colPadding, cv::BORDER_CONSTANT, cv::Scalar::all(0));

答案 1 :(得分:1)

I asked before几乎相同。至于你的例子,你只需将函数调用中的cols和row交换为上面提到的berak。

方法copyMakeBorder(...)同时存在于Mat和oclMat中,因此如果您尝试使用openCV的openCL-extension以获得更好的性能,它可能会很有用。

答案 2 :(得分:-1)

我不知道语法,但这里是伪代码

float width1, height1; //size of image1
float width2, height2; //original size of image2
float scale;

bool portrait = width2 < height2;

if(portrait) scale = height1 / height2;
else scale = width1 / width2;

float scaled_width2 = width2 * scale;
float scaled_height2 = height2 * scale;

当图像是肖像时,我们填充高度,否则我们填充宽度。 通过这种方式,图像将达到最大尺寸而不会被拉伸