2015-03-12 10 views
15

Ich versuche, einen vieery einfachen Tracker für 2D-Objekte mit Python-Wrapper für OpenCV (CV2) zu erstellen.Gibt es ein Beispiel für die Implementierung von cv2.KalmanFilter?

Ich habe bemerkt, nur 3 Funktionen:

  • Kalman-Filter (Konstruktor)
  • .predict()
  • .correct (Messung)

Meine Idee ist es, einen Code zu erstellen um zu überprüfen, ob kalman so funktioniert:

kf = cv2.KalmanFilter(...) 
# set initial position 

cv2.predict() 
corrected_position = cv2.correct([measurement_x, measurement_y]) 

Ich habe einige Beispiele mit der CV-Wrapper gefunden, aber nicht die CV2 ...

Vielen Dank im Voraus!

Antwort

23

Wenn Sie opencv2.4 verwenden, dann ist es eine schlechte Nachricht: Der KalmanFilter ist unbrauchbar, da Sie den Übergang (oder irgendeine andere) Matrix nicht einstellen können.

für opencv3.0 es richtig, wie das funktioniert:

import cv2, numpy as np 

meas=[] 
pred=[] 
frame = np.zeros((400,400,3), np.uint8) # drawing canvas 
mp = np.array((2,1), np.float32) # measurement 
tp = np.zeros((2,1), np.float32) # tracked/prediction 

def onmouse(k,x,y,s,p): 
    global mp,meas 
    mp = np.array([[np.float32(x)],[np.float32(y)]]) 
    meas.append((x,y)) 

def paint(): 
    global frame,meas,pred 
    for i in range(len(meas)-1): cv2.line(frame,meas[i],meas[i+1],(0,100,0)) 
    for i in range(len(pred)-1): cv2.line(frame,pred[i],pred[i+1],(0,0,200)) 

def reset(): 
    global meas,pred,frame 
    meas=[] 
    pred=[] 
    frame = np.zeros((400,400,3), np.uint8) 

cv2.namedWindow("kalman") 
cv2.setMouseCallback("kalman",onmouse); 
kalman = cv2.KalmanFilter(4,2) 
kalman.measurementMatrix = np.array([[1,0,0,0],[0,1,0,0]],np.float32) 
kalman.transitionMatrix = np.array([[1,0,1,0],[0,1,0,1],[0,0,1,0],[0,0,0,1]],np.float32) 
kalman.processNoiseCov = np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],np.float32) * 0.03 
#kalman.measurementNoiseCov = np.array([[1,0],[0,1]],np.float32) * 0.00003 
while True: 
    kalman.correct(mp) 
    tp = kalman.predict() 
    pred.append((int(tp[0]),int(tp[1]))) 
    paint() 
    cv2.imshow("kalman",frame) 
    k = cv2.waitKey(30) &0xFF 
    if k == 27: break 
    if k == 32: reset() 
+1

Danke für die Info, opencv 2.49 zu verwenden, leider ist es erforderlich ... Wir versuchen pykalman zu verwenden :) –

+0

viel einfacher als andere Codes. Aber eine Frage, ursprünglich mussten wir zuerst die Messungen vorhersagen/abschätzen und dann korrigieren? –

Verwandte Themen