OpenCV裁剪检测帧图像时右侧出现空白区域如何解决
问题根源
核心问题是搞混了MobileNet SSD检测框的参数含义:
模型返回的x,y,w,h四个值里,x、y是检测框左上角的横纵坐标,w、h是检测框的宽度和高度,不是裁剪区域的右下角坐标。
OpenCV读入的视频帧本质是NumPy数组,切片要求传入起始和结束两个索引,对应格式是帧数组[行起始:行结束, 列起始:列结束]。你原来的代码直接把w、h当结束索引传进去,裁剪范围根本和检测框实际位置对不上,自然会裁出带空白的异常图像。
修复方案
正确的裁剪逻辑需要先通过左上角坐标加对应宽高算出右下角坐标,同时加一层边界校验,兼容模型偶尔输出的越界、负坐标,避免报错:
for box_id in boxes_ids: x, y, w, h, track_id = box_id # 校验坐标合法性,避免负索引、越界问题 x1 = max(int(x), 0) y1 = max(int(y), 0) x2 = min(int(x + w), frame.shape[1]) y2 = min(int(y + h), frame.shape[0]) # 按正确范围裁剪 crop = frame[y1:y2, x1:x2] cv2.imshow("crop", crop) cv2.waitKey(5)
注:原代码用
id做变量名会覆盖Python内置的id()函数,建议换成track_id/cls_id这类名字,避免触发潜在bug。
几个细节说明:
frame.shape[0]对应帧的总高度(行方向总像素数),frame.shape[1]对应帧的总宽度(列方向总像素数)- 加
int()转换是因为部分模型输出的坐标是浮点数,直接传去切片会触发类型报错 - 边界校验可以避免检测框超出画面范围时,切片取到帧外的异常值
内容的提问来源于stack exchange,提问作者Shailly
相关产品推荐
相关产品推荐

