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

标签 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 的类型在函数本身内。

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

这是一个小示例函数:

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) 调用它

关于c++ - 如何在自己的函数中最好地处理 Mat 中的不同数字格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37683725/

相关文章:

c++ - 在运行时选择模板参数时如何避免代码呈指数级增长

c++ - 当 C++ 全局变量未显式初始化时发出警告?

c++ - 使用 OpenCV 编译时出现 Gtk+ 3 错误

c++ - 如何从 OpenCV rvecs 计算旋转角度

c++ - 将像素存储在二维数组中(以矩阵形式)

c++ 存储函数和参数列表以备后用

c++ - gtk(mm) 3 按钮背景颜色变化

opencv - 霍夫线:检测图像上的刻度

python - 如何从两个图像重建场景的3D

python-2.7 - 使用网络摄像头、OpenCV 和 Python 跟踪眼瞳位置