-- coding: utf-8 --
import cv2.cv as cv import cv2 import numpy as np
MAX_FEATURES = 500 # RADIUS2 = 25 DETECT_TURM = 20 #Déterminer le nombre d'images à utiliser WINDOW_NAME = u'object tracking'.encode ('cp932')
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS , 20 , 0.03)
class App:
def __init__(self):
cv2.namedWindow(WINDOW_NAME)
cv2.setMouseCallback(WINDOW_NAME , self.on_mouse)
self.src = cv2.VideoCapture('crossing_accident.avi')
if not self.src.isOpened():
vous ne pouvez pas imprimer import sys sys.exit()
self.points_now = None
self.detect_count = DETECT_TURM Compter autant que #DETECT_TURM
def auto_detect(self):
self.points_now = cv2.goodFeaturesToTrack(self.img_now , MAX_FEATURES , 0.01 , 10)
cv2.cornerSubPix(self.img_now , self.points_now , (10 , 10) , (-1 , -1) , criteria)
def remove_points(self):
index = 0
while index < len(self.points_now):
if self.status[index] == 0:
self.points_now = np.delete(self.points_now , index , 0)
self.status = np.delete(self.status , index , 0)
index -= 1
index += 1
def on_mouse(self , event , x , y , flags , param):
if event != cv2.EVENT_LBUTTONDOWN:
return
index = -1
mini = RADIUS2
count = 0
if self.points_now != None:
for point in self.points_now:
dx = x - point[0][0]
dy = y - point[0][1]
r2 = dx * dx + dy * dy
if r2 <= mini:
index = count
mini = r2
break
count += 1
if index >= 0:
self.points_now = np.delete(self.points_now , index , 0)
self.status = np.delete(self.status , index , 0)
else:
if self.points_now != None and len(self.points_now) >= MAX_FEATURES:
print u 'Plus aucun point caractéristique ne peut être extrait return
if self.points_now == None:
self.points_now = np.array([[[x , y]]] , np.float32)
else:
self.points_now = np.append(self.points_now , [[[x , y]]] , axis = 0).astype(np.float32)
cv2.cornerSubPix(self.img_now , self.points_now , (10 , 10) , (-1 , -1) , criteria)
def chk_detect(self):
self.detect_count- = 1 Soustrayez 1 du nombre de DETECT_TURM affecté à # self.detect_count if self.detect_count == 0: #Si self.detect_count devient 0 self.detect_count = DETECT_TURM Renvoie # self.detect_count à la valeur du premier DETECT_TURM self.auto_detect () # Extraire automatiquement les points caractéristiques
def run(self):
while True:
self.chk_detect () # Pendant la lecture de la vidéo, les points caractéristiques sont automatiquement extraits à chaque nombre d'images spécifié par DETECT_TURM. retval , frame = self.src.read()
if frame is None:
break
self.img_now = cv2.cvtColor(frame , cv2.COLOR_BGR2GRAY)
if self.points_now != None and len(self.points_now) > 0:
points_pre = self.points_now
self.points_now , self.status , err = \
cv2.calcOpticalFlowPyrLK(self.img_pre , self.img_now , points_pre , winSize = (10 , 10) , maxLevel = 3 , criteria = criteria , flags = 0 , minEigThreshold = 0.01)
print 'aaaa'
print len(points_pre)
print len(self.points_now)
#self.remove_points()
#for point in self.points_now:
for i in range (len (points_pre)): Remplacez "0 ~ nombre d'éléments du tableau" dans #points_pre par i, et répétez le processus pendant "0 ~ nombre d'éléments du tableau" diff_x = points_pre [i] [0] [0] --self.points_now [i] [0] [0] # Prend la différence entre les coordonnées x des points dans l'image précédente et les points dans l'image courante. diff_y = points_pre [i] [0] [1] --self.points_now [i] [0] [1] # Prendre la différence entre les coordonnées y des points dans l'image précédente et les points dans l'image courante. point = self.points_now[i] # diff = diff_x * diff_x + diff_y * diff_y # Prenez la distance entre les points de l'image précédente et les points de l'image courante de la même manière que le théorème des trois carrés. if diff> 1 et diff <2: #Si la distance entre le point de l'image précédente et le point de l'image courante est supérieure à 1 et inférieure à 2. cv2.circle (cadre, (point [0] [0], point [0] [1]), 4, (0, 0, 255 --255 * - (1 --diff)), -1, 8, 0) # Dessinez un point. La couleur des points doit changer en fonction de la vitesse de déplacement de l'objet. S'il est tôt, ce sera un point rouge, et s'il est tard, ce sera un point noir. #cv2.circle(frame , (point[0][0] , point[0][1]) , 4 , (0 , 0 , 255*random.random()) , -1 , 8 , 0)
self.remove_points()
cv2.imshow(WINDOW_NAME , frame)
self.img_pre = self.img_now.copy()
key = cv2.waitKey(33)
if key == 27:
break
elif key == 67 or key == 99:
self.points_now = None
elif key == 32:
self.auto_detect()
cv2.destroyAllWindows()
self.src.release()
if name == 'main': App().run()
Lorsque j'exécute le programme ci-dessus sur Spyder, j'obtiens l'erreur suivante.
runfile('C:/Users/tatomi/Desktop/chase/chasing.py', wdir='C:/Users/tatomi/Desktop/chase') Sortie impossible An exception has occurred, use %tb to see the full traceback.
SystemExit
J'ai l'impression de ne pas avoir pris de pass ou quelque chose comme ça, que dois-je faire?