在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);