2012-03-22 15 views
7

Sto aggiornando i campioni/c/motempl.c in OCV 2.3 e sono un po 'perplesso dal metodo cv :: updateMotionHistory(). Creo la storia segue quello che ho visto in motempl.c:Come chiamare cv :: updateMotionHistory() in OpenCV

history = cv::Mat::zeros(640, 480, CV_32FC1); 

Poi, mi chiamano updateMotionHistory() in questo modo:

cv::Mat diff = cv::Mat::zeros(640, 480, CV_8U); 

if(prevFrame.size().width != 0) { 
    cv::absdiff(currentFrame, prevFrame, diff); 
} else { 
    return; 
} 

cv::updateMotionHistory(diff, history, getElapsedSeconds(), MHI_DURATION); 

sembra ok, ma è sempre gettando il seguente:

OpenCV Error: Sizes of input arguments do not match() in cvUpdateMotionHistory 

Entrambe le matrici sono le stesse dimensioni ,, 640, 480, ma solo per divertimento ho provato a cambiare la storia a CV_8U che mi fa:

OpenCV Error: Unsupported format or combination of formats() in cvUpdateMotionHistory 

seguito sul campione, dove c'è questo:

mhi = cvCreateImage(size, IPL_DEPTH_32F, 1); 

ho motivo per cui la storia ha bisogno di essere immagine di un galleggiante, io non sono solo sicuro come chiamare questo metodo con matrici piuttosto che le istanze IplImage . Grazie!

+0

Avere è stata selezionata la dimensione effettiva del 'diff' dopo l'operazione 'absdiff'? Perché se le dimensioni di 'currentFrame' e' prevFrame' sono diverse, le dimensioni di 'diff' cambierebbero durante quell'operazione. La chiamata a 'updateMotionHistory' non produce un errore se rimuovo l'operazione' absdiff'. – sietschie

+0

Sì, diff è 640.480, CV_8U, che è parte del motivo per cui sono stato abbastanza confuso da postare questa domanda qui :) –

risposta

6

Ok, quindi l'ho capito, subito dopo aver fatto una taglia e ho pensato di pubblicare la risposta, non so quale sia l'etichetta su questo. La storia ha bisogno di essere CV_32FC1:

history = cv::Mat::zeros(480, 640, CV_32FC1); 

le righe/cols inizializzazione Mat sono un po 'poco intuitivo troppo:

cv::Mat diff = cv::Mat::zeros(480, 640, CV_8UC1); // not 640,480 

Poi:

cv::updateMotionHistory(diff, history, getElapsedSeconds(), MHI_DURATION); 
Problemi correlati