2012-04-13 2 views
5

У меня есть следующий фрагмент кода, который я создал для изменения интенсивности пикселя в изображении OpenCV (класс Cv :: Mat).C++: Как создать динамический тип шаблона

Как вы можете видеть, я выполняю цикл в обоих случаях, но с другим типом шаблона.

Функция передачи может быть перегружена.

Мой вопрос, поэтому, как я могу создать динамический тип шаблона так, что он выглядит лучше ..

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

Это не связано с ответом, но не эквивалентно src и dst? Что делает 'transfer()' do? –

ответ

11

Как о чем-то вроде этого:

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

Тогда вы можете сказать:

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

Непонятно, что касается объема вашего кода (выглядит как функция-член) и какой тип t есть, но вам должно быть начато:

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(/*...*/); 
    } 
} 
Смежные вопросы