at处理不同的图像类型

opencv .at handle different image types

本文关键字:图像 类型 处理 at      更新时间:2023-10-16

我有一些代码,我希望能够处理8位和16位图像。

代码之间的唯一区别是现在的8位代码使用:
filename.at<uchar>(i, j)

和16位代码使用:

filename.at<ushort>(i, j)

现在最简单的方法是在顶部包含一个if语句,检查图像类型,然后我只有两个代码块做同样的事情,但我想避免这样做,因为维护变得有点痛苦。

首先,我通读了OpenCV文档,我可能错过了它,但我没有看到任何返回Mat对象用于存储像素数据的数据类型的内容。所以如果我错过了,我会觉得很傻,但这是最好的。

我研究的另一个选项是函数指针,但我不确定我是否可以为。at模板函数做到这一点。

一个可能的解决方案是简单地根据输入的深度进行分支。(谢谢你的灵感,perfanoff!)

在访问单个像素之前:

bool eightBit = false;  //I assume 8- and 16-bits are the only options
if (m.depth() == CV_8U)
    eightBit = true;

在任何像素访问之前进行比较是一种优化,因此您可以避免调用.depth()并对每个像素进行比较,因为结果永远不会改变。

然后,在循环中:

if (eightBit)
{
 // Something using m.at<uchar>(i,j) 
}
else
{
 // Something using m.at<ushort>(i,j)
}

这将允许对像素数据进行读写访问。但是,像这样在内部循环中进行分支可能会影响性能。

您可以定义自己的函数来访问Mat中的元素,但是您应该测试它会有多慢。

inline ushort GetPixel(const Mat& m,int x,int y)
{
    if (m.depth == CV_8U)
       return m.at<uchar>(x,y);
    else return m.at<ushort>(x,y);
}

这是我的2ct。:

template < class T > 
void myfunction( Mat & img ) {
    // code with a lot of img.at<T>(y,x);
}

并命名为:

myfunction<ushort>(img);

或:

myfunction<uchar>(img);