at处理不同的图像类型
opencv .at handle different image types
我有一些代码,我希望能够处理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);
相关文章:
- Mat的convertTo函数在OpenCV中将灰度图像的类型转换为CV_32F时抱怨断言错误
- 如何为不同类型的图像设计加载器?
- 将打开的CV的重映射功能与类型CV_8SC1的源图像一起使用
- 调整图像类型"垫子"的大小 opencv C++
- 将RGB颜色图像转换为OpenCV C 中的索引颜色图像类型
- 如果输入图像矩阵实际上是复杂类型,MATLAB imresize() 会怎么做?
- 输入层类型:图像数据在窗口咖啡cpp中给出空白输出
- 如何在VTK DICOM阅读器中读取图像类型(0008,0008)
- 使用更新功能扩展QML图像类型
- 将图像字段作为斑点类型更新为QT C 中的数据库
- ATL ActiveX DLL 作为映射类型图像和数据加载了两次
- 如何使用avcodec从OpenCV::Mat类型的jpeg图像创建视频
- 是否可以将 JPEG(或 PNG)类型的图像设置为 exe(C++)
- 如何将labview图像类型转换为opencv图像类型(或Mat)
- OpenCV,dlib - 函数中的图像类型转换失败;在外面工作
- 将 c++ dll 导入 vb.net 时 float*(图像类型)的等效数据类型是什么?
- Visual Studio 2010调试器可视化Qt图像类型
- at处理不同的图像类型
- " cvWriteFrame "使用垫子 - 图像类型的等效功能是什么?
- 从 bmp(或其他图像类型)中提取第 "n" 个图像