2012-06-27 8 views
7

Estoy pasando una estera a otra función y cambiándola dentro de la función llamada. Esperaba que, al ser un tipo más complejo, se pasara automáticamente por referencia para que la matriz cambiara en la función de llamada, pero no es así. ¿Podría alguien señalarme la explicación de cómo devolver correctamente una Mat modificada de una función?OpenCV que cambia la estera dentro de una función (alcance de Mat)

He aquí el fragmento de código:

void callingFunction(Mat img) 
{ 
    Mat tst(100,500,CV_8UC3, Scalar(0,255,0)); 
    saveImg(tst, "Original image", true); 
    testImg(tst); 
    saveImg(tst, "Want it to be same as inside testImg but is same as Original", true); 
} 

void testImg(Mat img) 
{ 
    int rs = 50; // rows 
    int cs = 100; // columns 
    img = Mat(rs, cs, CV_8UC3, Scalar(255,0,0)); 
    Mat roi(img, Rect(0, 0, cs, rs/2)); 
    roi = Scalar(0,0,255); // change a subsection to a different color 

    saveImg(img, "inside testImg", true); 
} 

Gracias!

Respuesta

8

Tiene que definir Mat como parameter-reference (&). Aquí está el código editado:

void callingFunction(Mat& img) 
{ 
    Mat tst(100,500,CV_8UC3, Scalar(0,255,0)); 
    saveImg(tst, "Original image", true); 
    testImg(tst); 
    saveImg(tst, "Want it to be same as inside testImg but is same as Original", true); 
} 

void testImg(Mat& img) 
{ 
    int rs = 50; // rows 
    int cs = 100; // columns 
    img = Mat(rs, cs, CV_8UC3, Scalar(255,0,0)); 
    Mat roi(img, Rect(0, 0, cs, rs/2)); 
    roi = Scalar(0,0,255); // change a subsection to a different color 

    saveImg(img, "inside testImg", true); 
} 
+0

Así que tengo que pasar por referencia explícitamente. ¡Gracias! – zzzz

-2

Si es verdad que usted tiene que pasar explícitamente por referencia, a continuación, ¿cómo funcionan todas las funciones de OpenCV? Ninguno de ellos pasa valores por referencia, sin embargo, de alguna manera parece que escriben bien en Mat. Por ejemplo, aquí está la declaración de la función Sobel en imgproc.hpp:

//! applies generalized Sobel operator to the image 
CV_EXPORTS_W void Sobel(InputArray src, OutputArray dst, int ddepth, 
         int dx, int dy, int ksize=3, 
         double scale=1, double delta=0, 
         int borderType=BORDER_DEFAULT); 

como se puede ver, pasa en src y dst sin &. Y sin embargo, sé que después de llamar al Sobel con un dst vacío, terminará lleno. No '&' involucrado.

+2

typedef _OutputArray & OutputArray; - Estás completamente equivocado. – berak

2

Me pregunté sobre la misma pregunta, por lo que me gustaría aclarar aún más la respuesta dada por @ArtemStorozhuk (que es correcta).

La documentación OpenCV es engañoso aquí, porque parece que estás pasando la matriz por valor, pero de hecho el constructor de CV :: outputArray se define como sigue:

_OutputArray::_OutputArray(Mat& m) 

por lo que obtiene la matriz ¡por referencia!

Dado que operaciones como cv :: Mat :: create crean una nueva matriz, la operación libera la referencia y establece el couter en 1. Por lo tanto, para mantener el resultado en la función de llamada, debe pasar la matriz por referencia.

Cuestiones relacionadas