在OpenCV中,爲了避免各種內存錯誤,使用Mat時,常自己指定好類型,即寫作 Mat_。使用Mat_對imread讀入的圖像數據存儲,因爲OpenCV裏Mat_這種類型只存儲8位的圖片,若所讀圖不是CV_8U類型的,存儲時圖片會被強制轉化爲CV_8U類型,再用imshow展示出來的效果就是有灰色條紋的圖了。
原圖
有條紋的圖
Mat temp = imread("F:/baby.png"); //載入圖像到Mat
Mat_<uchar> mat = temp;
imshow("有條紋的圖", mat);
無條紋的圖
所以,如果非要使用Mat_的話,再加一句cvtColor(temp,temp,CV_RGBA2GRAY);同時,若圖像是彩色的,也會轉化爲灰度圖,注意不要用CV_RGBA2RGB,因爲存儲的爲8位單通道圖即單色灰度圖,必須用CV_RGBA2GRAY才能真正順利轉換,消除白色豎條。
Mat temp = imread("F:/baby.jpg"); //載入圖像到Mat
cvtColor(temp,temp,CV_RGBA2GRAY); //若不加此句會使圖片被存儲爲<uchar>時強制轉換爲帶豎條的灰圖
Mat_<uchar> mat = temp;
imshow("無條紋的圖", mat);