2011-08-03 14 views
8

en mi programa tengo una función que toma la imagen de la cámara y debe empaquetar todos los datos en la estructura OpenCV Mat. Desde la cámara obtengo ancho, alto y unsigned char* en el buffer de imagen. Mi pregunta es cómo puedo crear Mat a partir de estos datos, si tengo una variable Mat global. El tipo para la estructura Mat Tomé CV_8UC1.opencv crear mat a partir de los datos de la cámara

Mat image_; 

function takePhoto() { 
    unsigned int width = getWidthOfPhoto(); 
    unsinged int height = getHeightOfPhoto(); 
    unsinged char* dataBuffer = getBufferOfPhoto(); 
    Mat image(Size(width, height), CV_8UC1, dataBuffer, Mat::AUTO_STEP); 

    printf("width: %u\n", image.size().width); 
    printf("height: %u\n", image.size().height); 

    image_.create(Size(image.size().width, image.size().height), CV_8UC1); 
    image_ = image.clone(); 

    printf("width: %u\n", image_.size().width); 
    printf("height: %u\n", image_.size().height); 
} 

Cuando pruebo mi programa, me da derecho width y height de image, pero width y height de mi Mat mundial image_ es 0. ¿Cómo puedo poner los datos en mi variable global Mat varible correctamente?

Gracias.

Respuesta

14

Desafortunadamente, ni clone() ni copyTo() para copiar correctamente los valores de anchura/altura a otro Mat. ¡Al menos en OpenCV 2.3! Es una pena, en serio.

Sin embargo, puede resolver este problema y simplificar su código haciendo que la función devuelva el Mat. De esta manera no necesitará tener una variable global:

Mat takePhoto() 
{ 
    unsigned int width = getWidthOfPhoto(); 
    unsigned int height = getHeightOfPhoto(); 
    unsigned char* dataBuffer = getBufferOfPhoto(); 
    Mat image(Size(width, height), CV_8UC1, dataBuffer, Mat::AUTO_STEP); 
    return Mat; 
} 

int main() 
{ 
    Mat any_img = takePhoto(); 
    printf("width: %u\n", any_img.size().width); 
    printf("height: %u\n", any_img.size().height); 
} 
+0

Hola Karlphilip, muchas gracias por contribuir con stackoverflow y por ayudarnos. Soy nuevo en OpenCV y encuentro que tu respuesta es bastante útil para el proyecto en el que estoy trabajando en este momento. Tengo una pregunta rápida, ¿cuál es la diferencia entre: cv :: Mat y cvMat y cvCreateMat()? – user261002

+3

'cv :: Mat' es el tipo de Mat para la interfaz C++ de OpenCV. 'cvMat' es para la interfaz C. 'cvCreateMat()' crea un 'cvMat' en la interfaz C. No sigamos este hilo más, si tienes preguntas, puedes preguntarlas en nuevos temas. Nos vemos. – karlphillip

Cuestiones relacionadas