用零填充图像

4
我正在使用C++编程,试图将图像2调整为与图像1相同的尺寸,但是我不想拉伸图像。我试图将图像2复制到填充矩阵(在点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) in Mat, 文件 C:\opencv\opencv\modules\core\src\matrix.cpp, line 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)));

断言失败意味着任何一个提到的条件都未能满足。只需检查断言条件中提到的所有参数,您就会知道为什么会发生这种情况。 - Hemant Gangwar
2
image2.copyTo(padded(Rect(0, 0, image2.rows, image2.cols))); // 你交换了行和列 - berak
3个回答

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));

当我使用您提供的代码时,它会失败并显示错误:penCV错误:在copyMakeBorder中断言失败(top> = 0 && bottom> = 0 && left> = 0 && right> = 0),文件C:\ opencv \ opencv \ modules \ imgproc \ src \ utils.cpp,第208行。 - Adsa
搞定了,我意识到image2的列数比image1大。感谢您的帮助。 - Adsa
@Adsa.. 如果它能正常工作,你可以考虑接受这个答案 :)。 - sgarizvi

1
这段文字与我之前问过的问题几乎相同。对于你的例子,正如上面berak所提到的那样,在函数调用中只需交换列和行即可。
copyMakeBorder(...)方法既适用于Mat也适用于oclMat,因此如果您尝试使用openCV的openCL扩展以获得更好的性能,则可能会很有用。

-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;

当图片为纵向时,我们填充高度;否则,我们填充宽度。 通过这种方式,图片将以最大尺寸显示而不会被拉伸。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接