一般使用的灰度图像元素是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()

.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?

节省空间 https://www.cnblogs.com/happyamyhope/p/7244538.html