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

How to best handle different number formats in Mat in own functions

本文关键字:Mat 格式 数字 处理 自己的 函数      更新时间:2023-10-16

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

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

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

  3. 创建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;
}
} 

我认为您应该使用模板函数。看见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)来称呼它