一般使用的灰度圖像元素是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?