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

Posted

技术标签:

【中文标题】如何在自己的函数中最好地处理 Mat 中的不同数字格式【英文标题】:How to best handle different number formats in Mat in own functions 【发布时间】:2016-06-07 15:38:43 【问题描述】:

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

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

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

    创建 if-else 语句以区分函数本身内的 Mat 类型。

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

这是一个小例子函数:

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】:

我认为你应该使用模板函数。见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&lt;uchar&gt;(src, dst) 调用它

【讨论】:

以上是关于如何在自己的函数中最好地处理 Mat 中的不同数字格式的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地处理传递给 IFilter 的照片?

如何最好地处理 Neuraxle 管道中的错误和/或丢失数据?

在颤动中 - 我如何最好地处理和分配预先确定的键给 json 中的嵌套列表/数组

如何最好地处理 PHP 中构造函数接收强制非空值的情况,该值可能并不总是被初始化?

如何正确地将 cv::Mat 转换为具有完美匹配值的 torch::Tensor?

Room DAO 更新如何最好地处理旧的不需要的数据