我有一些代码,我希望能够处理8位和16位图像。
现在代码之间的唯一区别是8位代码使用:
filename.at<uchar>(i, j)
并且16位代码使用:
filename.at<ushort>(i, j)
现在最简单的方法是在顶部包含一个检查图像类型的if语句,然后我只有两个代码块做同样的事情,但是我想避免这种情况,因为维护变得有点像疼痛
首先,我阅读了OpenCV文档并且我可能错过了它,但是我没有看到任何返回Mat对象用于存储像素数据的数据类型。所以,如果我错过了,我会感到愚蠢,但那将是最好的。
我调查的另一个选项是函数指针,但我不确定我是否可以为.at模板函数执行此操作。
非常感谢任何有关这些选项的建议。
答案 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);