2012-04-13 20 views
5

Tengo el siguiente fragmento de código, que he creado para cambiar la intensidad de un píxel en una imagen OpenCV (clase Cv :: Mat).C++: ¿Cómo puedo crear plantilla dinámica tipo

Como puede ver, estoy bucleando en ambos casos, pero con un tipo de plantilla diferente.

La función 'transferencia' puede sobrecargarse.

Mi pregunta es, por lo tanto, ¿cómo puedo crear tipo de plantilla dinámica para que se vea mejor ..

Mat mat = _mat.clone() ; 
int channels = mat.channels(); 

switch(channels) 
{ 
case 1: 
    for (int i=0; i<mat.rows; i++) 
    { 
     for (int j=0; j<mat.cols; j++) 
     { 
      uchar src = mat.at<uchar>(i,j); 
      uchar dst = mat.at<uchar>(i,j); 

      t.transfer(src, dst); 
     } 
    } 
    break; 

case 3: 
    for (int i=0; i<mat.rows; i++) 
    { 
     for (int j=0; j<mat.cols; j++) 
     { 
      Vec3b src = mat.at<Vec3b>(i,j); 
      Vec3b dst = mat.at<Vec3b>(i,j); 

      t.transfer(src, dst); 
     } 
    } 
    break; 
} 

return mat ; 
+0

¿Esto no está relacionado con la respuesta, pero no es equivalente a src y dst? ¿Qué hace 'transfer()' hacer? –

Respuesta

11

¿Qué tal algo como esto:

template <typename U, typename T> 
void transfer_mat(Mat & mat, T & t) 
{ 
    for (int i = 0, r = mat.rows; i != r; ++j) 
    { 
     for (int j = 0, c = mat.cols; j != c; ++j) 
     { 
      U src = mat.at<U>(i, j); 
      U dst = mat.at<U>(i, j); 

      t.transfer(src, dst); 
     } 
    } 
} 

entonces se puede decir:

switch(channels) 
{ 
case 1: 
    transfer_mat<uchar>(mat, t); 
    break; 
case 2: 
    transfer_mat<Vec3b>(mat, t); 
    break; 
} 
2

No está claro el alcance de su código (parece una función de miembro) y de qué tipo t es, pero esto debería comenzar:

template<typename AtT> 
Mat& transfer_impl(Mat& mat, T& t) 
{ 
    for (int i = 0; i < mat.rows; ++i) 
     for (int j = 0; j < mat.cols; ++j) 
      t.transfer(mat.at<AtT>(i, j), mat.at<AtT>(i, j)); 
    return mat; 
}; 

Mat transfer(Mat const& _mat, T& t) 
{ 
    Mat mat = _mat.clone(); 
    switch (mat.channels()) 
    { 
    case 1: return transfer_impl<uchar>(mat, t); 
    case 3: return transfer_impl<Vec3b>(mat, t); 
    default: throw std::runtime_error(/*...*/); 
    } 
} 
Cuestiones relacionadas