2012-09-26 36 views
6

Estoy tratando de leer marcos de video con openCV, guardo datos en formato cv :: Mat. entonces quiero usar mi otro código que acepta "matriz de tipo int" para este marco de video. Sé que "cvMat" y "int type matrix" no son compatibles. Tal vez no estoy familiarizado con opencv, pero ¿puedo hacer algún tipo de conversión entre "cvMat" y "int mat", para que pueda usar mi código para los marcos de video capturados? digo "estera int", tal vez no es correcto, pero lo que quiero decir es lo siguiente:conversión entre matriz OpenCV y matriz int

cv::Mat videoFrame; 
int inputData[600][400]; 

quiero hacer algo como:

inputData = videoFrame; 

Gracias.

Respuesta

6

La manera más rápida es compartir la memoria: no se necesita copiar. Sin embargo, si modifica una matriz, y el otro será modificado (obvio!)

int inputData[600][400]; 
cv::Mat videoFrame(600, 400, CV_32UC1, inputData); 

Tenga en cuenta que cualquier llamada OpenCV más adelante VideoFrame que cambia su tipo/tamaño asignará una nueva pieza de memoria en la que el resultado será ser almacenados.

Si usted quiere tener matrices de datos separadas, puede utilizar memcpy -es la manera más rápida para duplicar los datos:

memcpy((char*)inputData, (char*)videoFrame.data, 600*400*sizeof(int)); 

El problema con este enfoque es que no es seguro en absoluto. ¿Qué pasa si videoFrame no es de tipo int? (Lo más probable es que sea char). ¿Qué ocurre si no se almacena continuamente en la memoria (puede suceder)? ...

+0

Querido Vasile, muchas gracias por tu respuesta. Su método sugerido es bastante bueno, pero tengo miedo de jugar con la asignación de memoria. Tal como lo mencionó, podría no ser seguro, y ya he experimentado muchos problemas de memoria hasta ahora (no en este caso). Entonces, ¿podría haber otra solución? Realmente no espero que mi código vuelva a estar muerto por problemas de memoria. Gracias de nuevo. –

+1

La manera segura es no utilizar inputData en absoluto. Mire su algoritmo y vea si puede usar solo videoFrame. La duplicación de datos a veces es un signo de codificación incorrecta – Sam

+0

Ok, gracias por su sugerencia. –