2012-04-13 20 views
5

Mam następujący fragment kodu, który stworzyłem do zmiany intensywności piksela w obrazie OpenCV (klasa Cv :: Mat).C++: W jaki sposób można utworzyć szablon dynamicznego typu?

Jak widać, zapętlam w obu przypadkach, ale z innym typem szablonu.

Funkcja "przesyłania" może być przeciążona.

Moje pytanie brzmi więc, w jaki sposób można stworzyć dynamiczny typ szablonu tak, że wygląda lepiej ..

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

Nie jest to związane z odpowiedzią, ale czy nie jest odpowiednikiem src i dst? Do czego służy funkcja 'transfer()'? –

Odpowiedz

11

Jak o coś takiego:

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

Wtedy można powiedzieć:

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

Nie jest jasne, jaki jest zakres twojego kodu (wygląda jak funkcja członka), i jaki typ t jest, ale powinno się zacząć:

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(/*...*/); 
    } 
} 
Powiązane problemy