使用OpenCV和C++提取子图像时遇断言错误求助
解决OpenCV裁剪图像时的断言错误问题
嘿,我来帮你搞定这个断言错误的问题!你遇到的这个报错,本质是OpenCV在验证你指定的裁剪区域(ROI)是否完全落在原图像范围内时触发的,咱们拆解一下问题根源:
问题分析
首先得明确OpenCV里Rect的参数规则:Rect(x, y, width, height),其中:
x:裁剪区域左上角的列坐标(从0开始计数)y:裁剪区域左上角的行坐标(从0开始计数)width:裁剪区域的宽度(列数)height:裁剪区域的高度(行数)
你的原图像尺寸是64×67(也就是cols=64,rows=67),但你设置的裁剪区域是Rect(1, 1, 64, 67),咱们算一下边界:
- 横向:
x + width = 1 + 64 = 65,而原图像只有64列,65已经超出了图像的右边界 - 纵向:
y + height = 1 + 67 = 68,原图像只有67行,同样超出了下边界
这就违反了OpenCV的断言条件,所以控制台会抛出那个错误。
解决方案
根据你的需求,有两种常见的修正方式:
- 从(1,1)位置裁剪最大的合法区域
调整width和height,让裁剪区域刚好不超出原图像:Rect crop(1, 1, 64 - 1, 67 - 1); // 即width=63,height=66 Mat rez = src(crop); - 裁剪整个原图像
如果你的目标是获取整个图像(可能是测试代码),那起始坐标应该从0开始:Rect crop(0, 0, 64, 67); Mat rez = src(crop); - 额外建议:先校验图像加载是否成功
有时候图像路径错误会导致src为空,也可能触发类似的奇怪错误,建议加上加载校验:Mat src = imread("Images/00011_00025.ppm"); if (src.empty()) { std::cout << "图像加载失败,请检查路径是否正确!" << std::endl; return -1; }
内容的提问来源于stack exchange,提问作者sixfeet
相关产品推荐
相关产品推荐

