Python使用OpenCV裁剪图像时传入变量触发imshow报错问题
错误根因分析
你遇到的size.width>0 && size.height>0报错,本质是裁剪得到的cropped_image是空数组,核心原因是你硬编码了画面宽高w=1280、h=720,但实际摄像头返回的shifted_img分辨率和这个值不匹配,导致计算出来的裁剪坐标超出了图像的实际边界,数组切片得到空值。
你手写结束坐标时能正常运行,是因为手写值刚好落在图像实际的尺寸范围内。
解决步骤
- 第一步:不要硬编码宽高,从实际画面中读取宽高
OpenCV读取的图像格式为(高度, 宽度, 通道数),因此要先从shifted_img中提取真实的宽高参数,替换原有的硬编码值:# 从实际图像中获取宽高 h, w = shifted_img.shape[:2] crop_factor = 0.5 - 第二步:计算裁剪坐标后增加边界校验,避免超出图像范围
可以用max()、min()函数做自动截断,防止坐标越界:x_crop_start = max(0, int((w - w*crop_factor)/2)) x_crop_end = min(w, int(w - x_crop_start)) y_crop_start = max(0, int((h - h*crop_factor)/2)) y_crop_end = min(h, int(h - y_crop_start)) cropped_image = shifted_img[y_crop_start:y_crop_end, x_crop_start:x_crop_end] - 第三步(可选调试):增加打印语句确认参数合理性
# 输出实际参数和裁剪范围,方便定位问题 print(f"实际图像宽高:{w}*{h},裁剪范围x:[{x_crop_start}:{x_crop_end}], y:[{y_crop_start}:{y_crop_end}]")
内容的提问来源于stack exchange,提问作者Iacopo Boccalari
相关产品推荐
相关产品推荐

