2013-01-24 3 views
1

Salut tout le monde Im très nouveau à la programmation et python-opencv en général, ive déjà cherché une réponse pour cela, mais je ne pouvais pas le trouver.Nouveau sur Python Opencv: Motion Tracking avec webcam Seuil/dilatation

Im essayant de faire le suivi de mouvement en utilisant ma webcam par:

  • prenant la différence absolue de l'image courante et l'image précédente
  • Ceci est converti en niveau de gris et courir à travers un filtre de seuil de sorte que seuls les pixels qui ont changé (c'est-à-dire où il y a du mouvement) seront blancs. Tous les autres pixels seront noirs.

Mais je reçois une erreur lorsque je tente de seuil et l'application de la dilatent dans la différence des cadres:

t_minus_dilate = cv2.dilate(t_minus_thresh, es) 
TypeError: <unknown> is not a numpy array 

Cela signifie que le cadre utilisé n'est pas un tableau numpy?

Heres partie de mon code:

cv2.namedWindow("window_b", cv2.CV_WINDOW_AUTOSIZE) 
# Structuring element 
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9,4)) 

## Webcam Settings 
capture = cv2.VideoCapture(0) 

def diffImg(t0, t1, t2): #calculates the difference between frames 
    d1 = cv2.absdiff(t2, t1) 
    d2 = cv2.absdiff(t1, t0) 
    return cv2.bitwise_and(d1, d2) 

t_minus = cv2.cvtColor(capture.read()[1], cv2.COLOR_RGB2GRAY) 
t_minus_thresh = cv2.threshold(t_minus, 0, 255, cv2.THRESH_OTSU) 
t_minus_dilate = cv2.dilate(t_minus_thresh, es) 

t = cv2.cvtColor(capture.read()[1], cv2.COLOR_RGB2GRAY) 
t_thresh = cv2.threshold(t, 0, 255, cv2.THRESH_OTSU) 
t_dilate = cv2.dilate(t_minus_thresh, es) 

t_plus = cv2.cvtColor(capture.read()[1], cv2.COLOR_RGB2GRAY) 
t_plus_thresh = cv2.threshold(t_plus, 0, 255, cv2.THRESH_OTSU) 
t_plus_dilate = cv2.dilate(t_plus_thresh, es) 


while True: 

    diff = diffImg(t_minus_dilate, t_dilate, t_plus_dilate) #difference between the frames 
    cv2.imshow('window_b',diff) 

    t_minus_dilate = t_dilate 
    t = diff 
    t_plus_dilate = cv2.dilate(diff, es) 

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

Je ne sais pas c'est le meilleur moyen d'utiliser cela, mais Im va utiliser ce code pour faire un jeu que l'objectif est de faire éclater les bulles qui tombent sur la écran, s'il y a un mouvement où la bulle est positionnée (s'il y a des pixels blancs) la bulle est éclatée.

Merci à l'avance

Répondre

3

Essayez ceci:

retvel, t_minus_thresh = cv2.threshold(t_minus, 0, 255, cv2.THRESH_OTSU) 
t_minus_dilate = cv2.dilate(t_minus_thresh, es) 

cv2.threshold retourne two values et le second est l'image

Questions connexes