while cap.isOpened():
diff = cv2.absdiff(frame1, frame2)
mask = filter_img(diff)
contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
(x,y,w,h) = cv2.boundingRect(contour)
if cv2.contourArea(contour) <200:
continue
cv2.rectangle(frame1, pt1=(x,y), pt2=(x+w, y+h), color=(0, 255, 0), thickness=2)
运行的话只有第一帧的画面。然后就报错退出了
我的思路是会不会opencv不能用absdiff()
【以下回答由 GPT 生成】
问题可能是由于absdiff()
函数的使用导致的。absdiff()
函数用于计算两个图像的差异。但是在你的代码中,两个图像的来源并没有被展示出来。我推测可能是由于图像源的问题导致只显示第一帧画面。
为了解决这个问题,你可以尝试以下步骤:
确保摄像头或视频文件被正确地打开并能够捕获实时的图像帧。
确保frame1
和frame2
分别是连续的两帧图像。你可以通过读取摄像头或者视频文件的帧来获得这两个图像。
检查filter_img()
函数是否正确地对差异图像进行过滤处理。你可以通过打印输出mask
图像来检查是否正确生成。
确保cv2.findContours()
函数能够正确地检测到差异图像中的轮廓。你可以通过打印输出contours
来检查是否正确获取到了轮廓。
确保cv2.rectangle()
函数能够正确地在frame1
上绘制矩形框。你可以通过打印输出frame1
图像来检查是否正确绘制了矩形框。
下面是一种修改后的代码示例,用于帮助你解决问题:
while cap.isOpened():
ret, frame1 = cap.read()
if not ret:
break
ret, frame2 = cap.read()
if not ret:
break
diff = cv2.absdiff(frame1, frame2)
mask = filter_img(diff)
cv2.imshow('Mask', mask)
contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
if cv2.contourArea(contour) < 200:
continue
(x, y, w, h) = cv2.boundingRect(contour)
cv2.rectangle(frame1, pt1=(x, y), pt2=(x+w, y+h), color=(0, 255, 0), thickness=2)
cv2.imshow('Result', frame1)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
请尝试使用以上修改后的代码,并确保摄像头或视频文件被正确地打开,以及filter_img()
函数能够正确地处理差异图像。如果问题仍然存在,请提供更多的代码和错误信息,以便我们诊断问题。