You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:51:22