在openCV 中经常会遇到需要访问mat类对象中的数据的情况,所以必须真确填写相应的数据类型。
1、OpenCV中的数据类型和常用的数据类型对应关系如下:
Mat_<uchar>---------CV_8U
Mat<char>-----------CV_8S
Nat_<short>---------CV_16S
Mat_<ushort>--------CV_16U
Mat_<int>-----------CV_32S
Mat_<float>----------CV_32F
Mat_<double>--------CV_64F
2、OpenCV中的数据类型宏定义和对应数据类型以及数值范围:
数值 体类型 取值范围
CV_8U 8位无符号整数 (0…..255)
CV_8S 8 位符号整数 (-128…..127)
CV_16U 16 位无符号整数 (0……65535)
CV_16S 16 位符号整数 (-32768…..32767)
CV_32S 32 位符号整数 (-2147483648……2147483647)
CV_32F 32 位浮点数 (-FLT_MAX ………FLT_MAX,INF,NAN)
CV_64F 64 位浮点数 (-DBL_MAX ……….DBL_MAX,INF,NAN)
注:
一般的图像文件格式使用的是 Unsigned 8bits吧,CvMat矩阵对应的参数类型就是 CV_8UC1,CV_8UC2,CV_8UC3。(最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3)
而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3... double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等。
变换这种矩阵数据类型,Mat类的函数convertTo()可以办到:
C++: void Mat::convertTo(OutputArray m,int rtype, double alpha=1, double beta=0 ) const
- M-输出矩阵,如果在操作之前没有合适的大小或类型,则重新分配。
- rType -期望的输出矩阵类型,或者,因为通道的数量与输入具有相同的深度;如果Rtype是负的,则输出矩阵将具有与输入相同的类型。
- α-可选比例因子。
- β-可选的增量与比例因子相加。
mask.convertTo(OutputArray m, CV_8UC3, -1.0, 255.0); // inverse the mask matrix means I_new(x,j) = -1*I(x,j) + 255.