如何在自己的函数中最好地处理Mat中的不同数字格式

时间:2016-06-07 15:38:44

标签: c++ opencv opencv3.0

当使用OpenCV编写自己的函数时,使用img.at<uchar>(y,x)img.at<float>(y,x),...访问单个像素值时,输入矩阵必须采用正确的格式。我可以设想一些不同的方法来使这样的函数能够处理不同类型的Mat

  1. 在执行其他操作之前,将src转换为正确的格式。这可能会导致在“降级”数字空间或“升级”情况下的某些效率损失(如果我做对了)的情况下会丢失一些信息。但也许转换为CV_64U仍然非常有效?

  2. 为每种类型的输入矩阵创建一个完整的函数似乎不是很优雅,但由于我是C ++的新手,我可能不习惯它。

  3. 创建if-else语句,以区分函数本身中Mat的类型。

  4. 还有其他一些我不知道的方法吗?有没有一种方法在效率,编码优雅和努力方面最好?

    这是一个小例子函数:

    myfoo(const Mat& src, Mat& dst)
    {
        dst = src.clone();
        for (int i = 0; i < dst.rows; i++)
            for (int j = 0; j < dst.cols; j++)
            {
                dst.at<uchar>(i, j) = i * j;
            }
    } 
    

1 个答案:

答案 0 :(得分:2)

我认为你应该使用模板功能。见http://en.cppreference.com/w/cpp/language/function_template

试试这个:

template <class T>
myfoo(const Mat& src, Mat& dst)
{
    dst = src.clone();
    for (int i = 0; i < dst.rows; i++)
        for (int j = 0; j < dst.cols; j++)
        {
            dst.at<T>(i, j) = i * j;
        }
}

您可以使用myfoo<uchar>(src, dst)

来调用它