opencv .at处理不同的图像类型

时间:2013-03-19 16:52:52

标签: c++ opencv

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

现在代码之间的唯一区别是8位代码使用:

filename.at<uchar>(i, j)

并且16位代码使用:

filename.at<ushort>(i, j)

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

首先,我阅读了OpenCV文档并且我可能错过了它,但是我没有看到任何返回Mat对象用于存储像素数据的数据类型。所以,如果我错过了,我会感到愚蠢,但那将是最好的。

我调查的另一个选项是函数指针,但我不确定我是否可以为.at模板函数执行此操作。

非常感谢任何有关这些选项的建议。

3 个答案:

答案 0 :(得分:1)

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

在访问单个像素之前:

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)
}

这将允许对像素数据的读写访问。但是,像这样在内循环中分支可能对性能不利。

答案 1 :(得分:0)

您可以定义自己的函数来访问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);
}

答案 2 :(得分:0)

这是我的2克拉。 :

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

并称之为:

myfunction<ushort>(img);

或:

myfunction<uchar>(img);