添加帧裁剪代码后cv2.absdiff()报数组尺寸不匹配错误
问题分析与解决
错误原因
你遇到的cv2.error: Sizes of input arguments do not match错误,核心原因有两个:
- 变量名冲突覆盖裁剪参数:代码中用于帧裁剪的
x,y,w,h变量,在后续轮廓检测的(x, y, w, h) = cv2.boundingRect(cont)语句中被覆盖。第一次循环时裁剪后的帧尺寸被保存为first_frame,后续循环因为变量被覆盖,裁剪尺寸改变,导致gray的尺寸和first_frame不匹配——cv2.absdiff要求输入的两个图像必须尺寸、通道数完全一致,因此报错。 - 未处理帧读取失败的情况:当视频读到最后一帧时,
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
相关产品推荐
相关产品推荐

