【问题标题】:OpenCV detecting the whole video frame as an objectOpenCV将整个视频帧检测为对象
【发布时间】:2019-09-19 01:04:22
【问题描述】:

我正在尝试制作一个使用我的笔记本电脑(win 10)网络摄像头检测对象的程序。为此,我使用的是 python 3.7 和 openCV 3.4 。这是我的代码:

import cv2
first_frame = None
video = cv2.VideoCapture(0)

while True:

    check, frame = video.read()
    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_frame = cv2.threshold(delta_frame, 40, 255, cv2.THRESH_BINARY)[1]

    thresh_frame = cv2.dilate(thresh_frame, None, iterations=2)

    (_, cnts, _) = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in cnts:
        if cv2.contourArea(contour) < 10000:
            continue

        status = 1
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)

    cv2.imshow("Gray Frame", gray)
    cv2.imshow("Delta Frame", delta_frame)
    cv2.imshow("Threshold Frame", thresh_frame)
    cv2.imshow("Color Frame", frame)

    key = cv2.waitKey(1)

    if key == ord("q"):
        break

    print(status, end=" ")
cv2.destroyAllWindows()
video.release()

它应该在移动或刚刚进入框架的对象周围绘制一个红色矩形。我在没有太多移动的地方使用它,所以当某些东西正在拍摄时它可以正常工作。首先它将图片作为第一帧并将其与其余帧进行比较,依此类推。问题是,每当我运行脚本时,它都会检测到作为对象出现在窗口中的整个视频帧(一个大的红色矩形覆盖了显示窗口的所有边缘和角落)。房间(更准确地说,静态背景)并不黑暗。为了测试它是否将背景检测为对象,我添加了一个status,它最初为零,并且每当对象进入框架或移动它时应该更改为 1,在控制台中打印状态。即使没有任何内容进入框架 1 也会打印,表明有问题。当脚本运行时,阈值窗口全是白色的,我相信如果它是黑色的,问题就会得到解决。另外,我该如何改进我的代码,以便它能够更快更好地检测到?

【问题讨论】:

  • 你能分享两张图片吗:1)你的背景图片,2)要进行检测的图片
  • @ShubhamJaiswal 我发布了解决方案,问题不在于背景图像,而在于光线条件,但我不知道为什么解决方案有效。

标签: python python-3.x opencv computer-vision


【解决方案1】:

我解决了这个问题,但是我真的不明白它为什么会起作用。这是我的解决方案:
考虑我的这行代码:

 thresh_frame = cv2.threshold(delta_frame, 40, 255, cv2.THRESH_BINARY)[1]

看来把cv2.THRESH_BINARY改成cv2.THRESH_BINARY_INV问题就解决了有真正的阳光(我没有改变设置)。早上发生同样的问题(整个框架被检测为一个对象)所以这次我将cv2.THRESH_BINARY_INV更改为cv2.THRESH_BINARY,问题就解决了。总而言之,我得出的结论是cv2.THRESH_BINARY适合阳光充足的时候可用且cv2.THRESH_BINARY_INV 在使用灯和 ... 时有效;但正如我所说,我不是这个原因。

【讨论】:

    猜你喜欢
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2020-11-24
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多