我有以下代码,我为改变OpenCV图像(Cv :: Mat类)中像素的强度而创建。
正如您所看到的,我在两种情况下循环,但使用不同的模板类型。
'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 :(得分: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;
}
答案 1 :(得分: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(/*...*/);
}
}