使用OpenCV和C++从图像中提取子图像

5

我正在尝试从OpenCV和C++中的RGB图像中获取子图像。我看到了关于这个主题的其他帖子,但对我没有用。

这是我使用的代码:

Mat src = imread("Images/00011_00025.ppm");
Rect crop(1, 1, 64, 67);
Mat rez = src(crop);

图片的尺寸是64x67,所以我不明白为什么会在控制台中出现以下错误信息:
Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows)
你有什么想法,这个错误是什么原因导致的?

从1开始,高度为67的矩形至少需要68行。在OpenCV中索引从0开始,因此只需使用cv :: Rect(0,0,64,67)。 - Micka
1个回答

12
Rect crop(1, 1, 64, 67);

矩形的左上角位置为(1,1),其大小设置为64x67。

Mat rez = src(crop);
使用这个矩形来裁剪图像时,由于矩形有一个像素的偏移量但大小与要裁剪的图像相同,因此您会超出边界。 您可以手动调整宽度和高度以解决偏移问题,或者使用cv::Range进行裁剪,这是我推荐的方法。
使用范围可以定义行和列的跨度来执行裁剪:
cv::Range rows(1, 64);
cv::Range cols(1, 67);
Mat rez = src(rows, cols);

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