-- coding: utf-8 --
import cv2.cv as cv import cv2 import numpy as np
MAX_FEATURES = 500 # RADIUS2 = 25 DETECT_TURM = 20 # Bestimmen Sie, wie viele Frames verwendet werden sollen WINDOW_NAME = u'Objektverfolgung'.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():
print u'Kann nicht drucken ' import sys sys.exit()
self.points_now = None
self.detect_count = DETECT_TURM Zählt so viele wie #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'Nicht mehr Feature-Punkte können extrahiert werden ' 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 Subtrahieren Sie 1 von der Anzahl von DETECT_TURM, die # self.detect_count zugewiesen ist if self.detect_count == 0: #Wenn self.detect_count 0 wird self.detect_count = DETECT_TURM Gibt # self.detect_count auf den Wert des ersten DETECT_TURM zurück self.auto_detect () #Automatisch Feature-Punkte extrahieren
def run(self):
while True:
self.chk_detect () #Während des Abspielens des Videos werden Feature-Punkte automatisch für jede von DETECT_TURM angegebene Anzahl von Frames extrahiert. 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:
für i im Bereich (len (points_pre)): Ersetzen Sie "0 ~ Anzahl der Array-Elemente" in #points_pre durch i und wiederholen Sie den Vorgang während "0 ~ Anzahl der Array-Elemente". diff_x = points_pre [i] [0] [0] --self.points_now [i] [0] [0] # Nehmen Sie die Differenz zwischen den x-Koordinaten der Punkte im vorherigen Frame und den Punkten im aktuellen Frame. diff_y = points_pre [i] [0] [1] --self.points_now [i] [0] [1] # Nehmen Sie die Differenz zwischen den y-Koordinaten der Punkte im vorherigen Frame und den Punkten im aktuellen Frame. point = self.points_now[i] # diff = diff_x * diff_x + diff_y * diff_y # Nehmen Sie den Abstand zwischen den Punkten im vorherigen Frame und den Punkten im aktuellen Frame auf die gleiche Weise wie im Drei-Quadrat-Theorem. wenn diff> 1 und diff <2: #Wenn der Abstand zwischen dem Punkt im vorherigen Frame und dem Punkt im aktuellen Frame größer als 1 und kleiner als 2 ist. cv2.circle (Rahmen, (Punkt [0] [0], Punkt [0] [1]), 4, (0, 0, 255 - 255 * - (1-Diff)), -1, 8, 0) #Zeichne einen Punkt. Die Farbe der Punkte sollte sich abhängig von der Bewegungsgeschwindigkeit des Objekts ändern. Wenn es früh ist, ist es ein roter Punkt, und wenn es spät ist, ist es ein schwarzer Punkt. #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()
Wenn ich das obige Programm auf Spyder ausführe, wird der folgende Fehler angezeigt.
runfile('C:/Users/tatomi/Desktop/chase/chasing.py', wdir='C:/Users/tatomi/Desktop/chase') Ausgabe nicht möglich An exception has occurred, use %tb to see the full traceback.
SystemExit
Ich habe das Gefühl, ich habe keinen Pass genommen oder so. Was soll ich tun?
Recommended Posts