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

添加帧裁剪代码后cv2.absdiff()报数组尺寸不匹配错误

问题分析与解决

错误原因

你遇到的cv2.error: Sizes of input arguments do not match错误,核心原因有两个:

  1. 变量名冲突覆盖裁剪参数:代码中用于帧裁剪的x,y,w,h变量,在后续轮廓检测的(x, y, w, h) = cv2.boundingRect(cont)语句中被覆盖。第一次循环时裁剪后的帧尺寸被保存为first_frame,后续循环因为变量被覆盖,裁剪尺寸改变,导致gray的尺寸和first_frame不匹配——cv2.absdiff要求输入的两个图像必须尺寸、通道数完全一致,因此报错。
  2. 未处理帧读取失败的情况:当视频读到最后一帧时,cam.read()会返回(False, None),此时frame为None,执行frame = frame[y:y+h, x:x+w]会直接报错,也可能间接导致后续尺寸不匹配问题。

修复后的代码

def press_it():
    first_frame = None
    status_list = [None, None]
    times = []
    startTime = datetime.now()
    print(startTime)
    # 存储物体检测与运动时间段的Dataframe
    df = pd.DataFrame(columns=['Start', 'End', 'Duration'])
    cam = cv2.VideoCapture(file)
    length = int(cam.get(cv2.CAP_PROP_FRAME_COUNT))
    print(length)
    # 裁剪参数,使用独立命名避免冲突
    crop_y = 50
    crop_x = 50
    crop_h = 100
    crop_w = 200

    # 遍历视频帧
    while cam.isOpened():
        check, frame = cam.read()
        # 处理帧读取失败的情况
        if not check or frame is None:
            break
        length -= 1
        # 执行帧裁剪
        frame = frame[crop_y:crop_y+crop_h, crop_x:crop_x+crop_w]
        status = 0

        # 转为灰度图并高斯模糊
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray = cv2.GaussianBlur(gray, (21, 21), 0)

        # 初始化第一帧
        if first_frame is None:
            first_frame = gray
            continue

        # 计算帧差
        delta_frame = cv2.absdiff(first_frame, gray)
        _, thresh_delta = cv2.threshold(delta_frame, 30, 255, cv2.THRESH_BINARY)
        thresh_delta = cv2.dilate(thresh_delta, None, iterations=3)

        # 查找轮廓
        cnts, _ = cv2.findContours(thresh_delta.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        # 过滤小轮廓
        Acuraccy = acuraccySlider
        for cont in cnts:
            if cv2.contourArea(cont) < Acuraccy:
                continue
            status = 1
            # 重命名轮廓矩形变量,避免覆盖裁剪参数
            (cx, cy, cw, ch) = cv2.boundingRect(cont)
            cv2.rectangle(frame, (cx, cy), (cx+cw, cy+ch), (0, 0, 255), 3)

关键修改点

  • 将裁剪参数重命名为crop_x, crop_y, crop_w, crop_h,避免和轮廓检测的矩形变量冲突。
  • 添加帧读取有效性判断:if not check or frame is None: break,防止处理空帧。
  • 轮廓检测后的矩形变量改为cx, cy, cw, ch,不再覆盖原裁剪参数。

内容的提问来源于stack exchange,提问作者MojtabaMAleki02

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:45:38