2015-03-12 10 views
15

Sto provando a creare un semplice tracciatore veeery per oggetti 2D usando python wrapper per OpenCV (cv2).Esiste un esempio di implementazione di cv2.KalmanFilter?

ho notato solo 3 funzioni:

  • Filtro di Kalman (costruttore)
  • .predict()
  • .correct (misura)

La mia idea è quella di creare un codice per verificare se kalman funziona in questo modo:

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

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

Ho trovato alcuni esempi usando il wrapper cv ma non il cv2 ...

Grazie in anticipo!

risposta

23

se si utilizza opencv2.4, quindi è una cattiva notizia: il KalmanFilter è inutilizzabile, dal momento che non è possibile impostare la transizione (o qualsiasi altra) Matrix.

per opencv3.0 funziona correttamente, in questo modo:

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

Grazie per le informazioni, sfortunatamente è richiesto di utilizzare OpenCV 2.49 ... Stiamo cercando di utilizzare pykalman :) –

+0

molto più semplice rispetto ad altri codici. Ma una domanda, in origine, dovevamo prima prevedere/stimare e poi correggere le misurazioni no? –

Problemi correlati