2012-04-13 68 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()'做什麼? – 2012-04-13 19:12:05

回答

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(/*...*/); 
    } 
}