2012-03-22 18 views
7

Estoy actualizando samples/c/motempl.c a OCV 2.3 y estoy un poco desconcertado por el método cv :: updateMotionHistory(). Creo la historia después de lo que he visto en motempl.c:Cómo llamar a cv :: updateMotionHistory() en OpenCV

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

Entonces, me llaman updateMotionHistory(), así:

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); 

parece que está bien, pero siempre está lanzando el siguiente:

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

Ambas matrices son del mismo tamaño ,, 640, 480, pero sólo por diversión he intentado cambiar la historia para que me CV_8U obtiene:

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

Siguiendo en la muestra, donde hay esto:

mhi = cvCreateImage(size, IPL_DEPTH_32F, 1); 

entiendo por qué la historia tiene que ser una imagen de flotador, que no soy seguro de cómo llamar a este método con matrices en lugar de casos IplImage . ¡Gracias!

+0

Ha comprobado el tamaño real del 'diff' después de la operación 'absdiff'? Porque si los tamaños de 'currentFrame' y' prevFrame' son diferentes, el tamaño de 'diff' cambiaría durante esa operación. La llamada a 'updateMotionHistory' no produce un error si elimino la operación' absdiff'. – sietschie

+0

Sí, diff es 640,480, CV_8U también, que es parte de la razón por la que estaba lo suficientemente confundido como para publicar esta pregunta aquí :) –

Respuesta

6

Ok, así que me di cuenta de esto, justo después de hacer esto una recompensa y pensé que debería publicar la respuesta, no estoy seguro de cuál es la etiqueta sobre eso. La historia tiene que ser CV_32FC1:

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

Las filas/cols inicialización Mat son un poco demasiado poco intuitivo:

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

continuación:

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