如何在自己的函数中最好地处理 Mat 中的不同数字格式
How to best handle different number formats in Mat in own functions
当使用 OpenCV 编写自己的函数时,这些函数使用 img.at<uchar>(y,x)
、img.at<float>(y,x)
、...访问单个像素值,输入矩阵必须采用正确的格式。我可以想象一些不同的方法来使这样的函数能够处理不同类型的 Mat
.
在执行其他操作之前将 src
转换为正确的格式。在 "downgrading" 数字 space 的情况下,这可能会导致一些信息丢失,而在 "upgrading" 的情况下,这可能会导致一些效率损失(如果我做对了)。但也许转换为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;
}
}
我认为你应该使用模板函数。参见 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)
调用它
当使用 OpenCV 编写自己的函数时,这些函数使用 img.at<uchar>(y,x)
、img.at<float>(y,x)
、...访问单个像素值,输入矩阵必须采用正确的格式。我可以想象一些不同的方法来使这样的函数能够处理不同类型的 Mat
.
在执行其他操作之前将
src
转换为正确的格式。在 "downgrading" 数字 space 的情况下,这可能会导致一些信息丢失,而在 "upgrading" 的情况下,这可能会导致一些效率损失(如果我做对了)。但也许转换为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;
}
}
我认为你应该使用模板函数。参见 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)