5

OpenCV イメージ (Cv::Mat クラス) のピクセルの強度を変更するために作成した次のコードがあります。

ご覧のとおり、どちらの場合もループしていますが、テンプレートの種類が異なります。

「転送」関数はオーバーロードできます。

したがって、私の質問は、動的テンプレートタイプを作成して見栄えを良くするにはどうすればよいかということです..

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 ;
4

2 に答える 2

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;
}
于 2012-04-13T19:17:59.223 に答える
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(/*...*/);
    }
}
于 2012-04-13T19:18:07.650 に答える