如何让OpenCV中的运动检测器对光线条件不敏感?

时间:2016-07-02 09:31:08

标签: python opencv motion-detection

我试图制作一个运动探测器,但正如我所看到的,由于光照条件,它非常敏感。我想检测飞镖盘是否有变化(所以当有人投掷飞镖时,检测它)。

这是我尝试的方式:

"""
Vecsei Gabor
"""

import cv2

#Initialize the first frame in the video stream
prevFrame = None
#Area of the detected contour, below this value it's not counted as detected
dontCare = 500
#Capture from webcam
cap = cv2.VideoCapture(0)
#Limit the FPS to 10 (For this task the lower the better)
cap.set(cv2.cv.CV_CAP_PROP_FPS, 15)
#counter for the detection
i = 0

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    #Blur for better results
    output = cv2.GaussianBlur(frame, (21, 21), 0)

    #If the first frame is None, initialize it
    if prevFrame is None:
        prevFrame = output
        continue

    #Compute the absolute difference between the current frame and
    #First frame
    frameDelta = cv2.absdiff(prevFrame, output)
    #Convert to gray to detect contours
    frameDelta = cv2.cvtColor(frameDelta, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(frameDelta, 21, 255, cv2.THRESH_BINARY)[1]

    #Dilate the thresholded image to fill in holes, then find contours
    #on thresholded image
    thresh = cv2.dilate(thresh, None, iterations=2)

    cnts, hier = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)

    cnts_sorted = sorted(cnts, key = cv2.contourArea, reverse = True)[:1]

    #Loop over the contours
    for c in cnts_sorted:
        #If the contour is too small, ignore it
        if cv2.contourArea(c) < dontCare:
            continue

        # compute the bounding box for the contour, draw it on the frame,
        # and update the text
        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        i+=1
        print "Detected something!" + str(i)
        print "Area: " + str(cv2.contourArea(c))
        prevFrame = output


    cv2.imshow('Webcam ',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

基本上我只是观察两帧之间的差异,如果帧上有变化,我将其保存为新图像,这样我们就可以检测到新的变化。

0 个答案:

没有答案