opencv / python:运动检测奇怪的阈值

时间:2013-01-25 19:57:46

标签: python opencv motion threshold

嘿伙计们所以我正在尝试使用我的网络摄像头制作一个动作检测程序,但是当我对帧的差异进行阈值处理时,我得到了这个奇怪的结果:

当我搬家时:(我猜似乎没问题) enter image description here

我不动的时候 enter image description here

这可能是什么?我已经运行了几个程序,这些程序具有完全相同的算法,并且阈值处理正常。

继承我的代码:

import cv2
import random
import numpy as np

# Create windows to show the captured images
cv2.namedWindow("window_a", cv2.CV_WINDOW_AUTOSIZE) 
cv2.namedWindow("window_b", cv2.CV_WINDOW_AUTOSIZE)

# Structuring element
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9,4))
## Webcam Settings
capture = cv2.VideoCapture(0)

#dimensions
frameWidth = capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)
frameHeight = capture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)

while True:
    # Capture a frame
    flag,frame = capture.read()

    current = cv2.blur(frame, (5,5))
    difference = cv2.absdiff(current, previous) #difference is taken of the current frame and the previous frame

    frame2 = cv2.cvtColor(difference, cv2.cv.CV_RGB2GRAY)
    retval,thresh = cv2.threshold(frame2, 10, 0xff, cv2.THRESH_OTSU)
    dilated1 = cv2.dilate(thresh, es)
    dilated2 = cv2.dilate(dilated1, es)
    dilated3 = cv2.dilate(dilated2, es)
    dilated4 = cv2.dilate(dilated3, es)

    cv2.imshow('window_a', dilated4)
    cv2.imshow('window_b', frame)

    previous = current

    key = cv2.waitKey(10) #20
    if key == 27: #exit on ESC
        cv2.destroyAllWindows()
        break

提前致谢!

1 个答案:

答案 0 :(得分:0)

你需要的第一件事就是previous = cv2.blur(frame, (5,5))在你的while循环之前抓取一帧之后填充你之前的样本。

这将使您发布的代码有效,但无法解决您的问题。

我认为您遇到的问题是由于您使用的阈值算法类型。尝试使用二进制文件cv2.THRESH_BINARY,而不是Otsu。它似乎为我解决了这个问题。