opencv at<>类型总结
2017-06-08 10:05
155 查看
自从OpenCV推出了Mat后越来越像是Matlab了,使用起来方便了很多,但是,在用at方法访问Mat时,如何选用合适的typename类型来访问相应的Mat元素是个头疼的问题。
比如:
int Height = 100;
int Width = 100;
Mat ImageMat8U(Height, Width, CV_8UC1);
for(int i=0; i<Height; i++)
{
for(int j=0; j<Width;j++)
{
ImageMat8U.at<uchar>(i, j) = (uchar)0; //编译可以通过,运行也正确
ImageMat8U.at<int>(i, j) = (uchar)0; //编译可以通过,运行时会发生asser错误
}
}
通常如果选错了typename,编译仍然可以通过,但是运行时总会发生assert错误,原因是无法通过depth检查。这里对不同类型的Mat使用at方法时对应的typename做个总结:
CV_8U=0: bool或者uchar
CV_8S=1: schar或者char
CV_16U=2: ushort
CV_16S=3: short
CV_32S=4: int或者unsigned
CV_32F=5: float
CV_64F=6: double
实际上数据depth的检查涉及到了一个模板类:
template<typename _Tp> class CV_EXPORTS DataDepth {};
这个类的特化就指定了Mat类型与typename类型之间的对应关系:
template<> class DataDepth<bool> { public: enum { value = CV_8U, fmt=(int)’u’ }; };
template<> class DataDepth<uchar> { public: enum { value = CV_8U, fmt=(int)’u’ }; };
template<> class DataDepth<schar> { public: enum { value = CV_8S, fmt=(int)’c’ }; };
template<> class DataDepth<char> { public: enum { value = CV_8S, fmt=(int)’c’ }; };
template<> class DataDepth<ushort> { public: enum { value = CV_16U, fmt=(int)’w’ }; };
template<> class DataDepth<short> { public: enum { value = CV_16S, fmt=(int)’s’ }; };
template<> class DataDepth<int> { public: enum { value = CV_32S, fmt=(int)’i’ }; };
// this is temporary solution to support 32-bit unsigned integers
template<> class DataDepth<unsigned> { public: enum { value = CV_32S, fmt=(int)’i’ }; };
template<> class DataDepth<float> { public: enum { value = CV_32F, fmt=(int)’f’ }; };
template<> class DataDepth<double> { public: enum { value = CV_64F, fmt=(int)’d’ }; };
template<typename _Tp> class DataDepth<_Tp*> { public: enum { value = CV_USRTYPE1, fmt=(int)’r’
4000
}; };
我是个新手,如果说的不对还希望路过的大大不要笑话。
比如:
int Height = 100;
int Width = 100;
Mat ImageMat8U(Height, Width, CV_8UC1);
for(int i=0; i<Height; i++)
{
for(int j=0; j<Width;j++)
{
ImageMat8U.at<uchar>(i, j) = (uchar)0; //编译可以通过,运行也正确
ImageMat8U.at<int>(i, j) = (uchar)0; //编译可以通过,运行时会发生asser错误
}
}
通常如果选错了typename,编译仍然可以通过,但是运行时总会发生assert错误,原因是无法通过depth检查。这里对不同类型的Mat使用at方法时对应的typename做个总结:
CV_8U=0: bool或者uchar
CV_8S=1: schar或者char
CV_16U=2: ushort
CV_16S=3: short
CV_32S=4: int或者unsigned
CV_32F=5: float
CV_64F=6: double
实际上数据depth的检查涉及到了一个模板类:
template<typename _Tp> class CV_EXPORTS DataDepth {};
这个类的特化就指定了Mat类型与typename类型之间的对应关系:
template<> class DataDepth<bool> { public: enum { value = CV_8U, fmt=(int)’u’ }; };
template<> class DataDepth<uchar> { public: enum { value = CV_8U, fmt=(int)’u’ }; };
template<> class DataDepth<schar> { public: enum { value = CV_8S, fmt=(int)’c’ }; };
template<> class DataDepth<char> { public: enum { value = CV_8S, fmt=(int)’c’ }; };
template<> class DataDepth<ushort> { public: enum { value = CV_16U, fmt=(int)’w’ }; };
template<> class DataDepth<short> { public: enum { value = CV_16S, fmt=(int)’s’ }; };
template<> class DataDepth<int> { public: enum { value = CV_32S, fmt=(int)’i’ }; };
// this is temporary solution to support 32-bit unsigned integers
template<> class DataDepth<unsigned> { public: enum { value = CV_32S, fmt=(int)’i’ }; };
template<> class DataDepth<float> { public: enum { value = CV_32F, fmt=(int)’f’ }; };
template<> class DataDepth<double> { public: enum { value = CV_64F, fmt=(int)’d’ }; };
template<typename _Tp> class DataDepth<_Tp*> { public: enum { value = CV_USRTYPE1, fmt=(int)’r’
4000
}; };
我是个新手,如果说的不对还希望路过的大大不要笑话。
相关文章推荐
- OpenCV——像素数据类型总结<摘>
- C++ 类型转换 atoi atol atof <stdlib.h>, itoa ftoa char <---> string
- 读<<CLR via C#>>总结(2) 对象创建的原理和两种类型转换方法
- 【OpenCV3图像处理】Mat中元素的获取与赋值 ( 对比.at<>()函数 和 .ptr<>()函数)
- 工作总结 无法确定条件表达式的类型,因为“<null>”和“System.DateTime”之间没有隐式转换 解决办法 object——Nullable<T> (可空类型)
- 我刚刚写了一个map的题目,还用到了#include<string>的头文件,下面我来总结一下 map<类型>变量 q q.find(找字符串) q.end()是否到达末尾
- 工作总结日志<三> 数控系统RTLinux内核上几个系统类型和函数在RTAI内核上的对应
- Parse Fatal Error at line 41 column 24: 元素类型 "url-pattern" 必须由匹配的结束标记 "</url-pattern>" 终止
- Redis Hash类型数据常用命令总结<转>
- Opencv中at<> 与ptr<> 的不同
- 读<<CLR via C#>>总结(3) 值类型和引用类型的区别
- 读<<CLR via C#>>总结(5) 如何合理使用类型的可见性和成员的可访问性来定义类
- 读<<CLR via C#>>总结(6) 详谈实例构造器和类型构造器
- opencv 之Mat, vector<point2f>,Point3d Iplimage 常见类型转换
- Parse Fatal Error at line 41 column 24: 元素类型 "url-pattern" 必须由匹配的结束标记 "</url-pattern>" 终止
- 矩阵类型及对应的at<>类型
- ArcGIS Engine栅格数据使用总结<转>
- c#值类型和引用类型<转>
- Linq系列(2)——类型推断,IEnumerable<T>和IQueryable<T>
- <<展现C#>>第四章 C#类型(修订)