一般使用的灰度图像元素是8位的uchar型(注意不是无符号整型,而是无符号字符型。元素值0~255),自定义Mat矩阵时,推荐使用8位无符号字符型,即CV_8U、CV_8UC3。
再说一遍,条件反射式的记住:一般见到的Mat的元素是8位无符号字符型,不是8位无符号整型。
【元素类型】
CV_8U(即CV_8UC1)、CV_8UC3、CV_32S、CV_32F等,16、64位用的少本文不讨论。
U——usigned char(无符号字符型,不是无符号整型)
C——通道数
S——signed int(有符号整型)
【范围与默认值】
CV_8U——0~255,205
CV_8S——0~255,-51
CV_32S——int型的范围,-842150451
CV_32F——浮点型的范围,-431602080
对于图像,显示范围整数0~255,小数0~1.0,所以float类型先将图像归一化,normalize(d, d, 1.0, 0.0, NORM_MINMAX)再显示。
默认值查看方式:
Mat data(3, 3, CV_32F); cout << data << endl;
.at()<类型>(行,列),中类型要与Mat中元素类型一致。注意行、列是从0索引开始的。所以2行3列处得写成.at()<类型>(1,2)
灰度图:cout<<(int)gray.at<uchar>(row,col)<<endl; //转int正常显示
彩色图:
cout<<img.at<Vec3b>(row,col)<<endl; //b、g、r三元素的向量,Vec3b参考我的另一篇博客
cout<<(int)img.at<Vec3b>(row,col)[0]<<endl; //b的值
【格式转换】
Mat data1(3, 3, CV_8S); Mat data2; data2.convertTo(data2, CV_32F); cout << data1 << endl; cout << data2 << endl;
高精度往低精度转换要注意范围。
【多余的话】
1、Mat里元素类型为什么是uchar?