2012-04-13 7 views
5

OpenCVイメージ(Cv :: Matクラス)のピクセルの強度を変更するために作成した次のコードがあります。C++:動的テンプレートタイプを作成するには

ご覧のとおり、私は両方のケースでループしていますが、テンプレートの種類は異なります。

'transfer'関数をオーバーロードすることができます。

私の質問は、このようなものについてはどのように

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()'は何をしますか? –

答えて

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(/*...*/); 
    } 
} 
関連する問題