写一个目标跟踪算法遇到的问题

我用的是opencv3.4.1和python3.6
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
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)


运行结果及详细报错内容

运行的话只有第一帧的画面。然后就报错退出了

img

我的解答思路和尝试过的方法

我的思路是会不会opencv不能用absdiff()

【以下回答由 GPT 生成】

问题可能是由于absdiff()函数的使用导致的。absdiff()函数用于计算两个图像的差异。但是在你的代码中,两个图像的来源并没有被展示出来。我推测可能是由于图像源的问题导致只显示第一帧画面。

为了解决这个问题,你可以尝试以下步骤:

  1. 确保摄像头或视频文件被正确地打开并能够捕获实时的图像帧。

  2. 确保frame1frame2分别是连续的两帧图像。你可以通过读取摄像头或者视频文件的帧来获得这两个图像。

  3. 检查filter_img()函数是否正确地对差异图像进行过滤处理。你可以通过打印输出mask图像来检查是否正确生成。

  4. 确保cv2.findContours()函数能够正确地检测到差异图像中的轮廓。你可以通过打印输出contours来检查是否正确获取到了轮廓。

  5. 确保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()函数能够正确地处理差异图像。如果问题仍然存在,请提供更多的代码和错误信息,以便我们诊断问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^