讀入數字圖像到數組,用CNN進行訓練,發現關於圖像讀取的一個問題。
問題描述:讀取灰度數字圖像,在驗證時發現存在錯誤,從圖像到數組中的值不完全一樣?
main code as follows:
int dst_width = 12, dst_height = 17;//set the dst size int vec_Num = dst_width*dst_height; /*the second parameter must set when read gray image, //the default value=1 which return a 3-channel color image*/ Mat imgSrc = imread(img_path); if (imgSrc.empty()) { cout << "read " << img_path.c_str() << " failed!" << endl; } Size dstSize = Size(dst_width, dst_height); Mat imgDst = Mat(dstSize, CV_8UC1); resize(imgSrc, imgDst, dstSize); vector<float> arr(vec_Num);
int dst_width = 12, dst_height = 17;//set the dst size int vec_Num = dst_width*dst_height; /*the second parameter must set when read gray image, //the default value=1 which return a 3-channel color image*/ Mat imgSrc = imread(img_path, 0); if (imgSrc.empty()) { cout << "read " << img_path.c_str() << " failed!" << endl; } Size dstSize = Size(dst_width, dst_height); Mat imgDst = Mat(dstSize, CV_8UC1); resize(imgSrc, imgDst, dstSize); vector<float> arr(vec_Num); ///method 2 memcpy the image data to uchar arr in rows unsigned char *imgData = new unsigned char[vec_Num]; memcpy(imgData, imgDst.data, imgDst.rows*imgDst.cols*sizeof(unsigned char)); for (int i = 0;i < vec_Num;i++) { arr[i] = (float)(imgData[i])/255; } //test to print for (int q = 0;q < imgDst.rows;q++) { for (int k = 0;k < imgDst.cols;k++) { int pos = q*imgDst.cols + k; cout << setw(3) << (int)arr[pos] << " "; } cout << endl; } cout << endl; delete[] imgData; imgSrc.release(); imgDst.release();
the result1 as follows:
左圖為讀入到數組以后,print出來的 右圖為原始圖像
差異很明顯,同時,錯誤也很明顯。
現在修改代碼:
Mat imgSrc = imread(img_path,0);
the result2 as follows:
左圖為修改代碼后讀入到數組,print出來的 右圖為原始圖像
conclusion:很明顯得到的結果是不同的,所以,通過是這次使用imread()函數,告訴我們要注意一些缺省的默認參數是否與自己當前所解決的問題一致。
Appendix:
The OpenCV API reference introduce as follows:
C++: Mat imread(const string& filename, int flags=1 )
Parameters:
filename – Name of file to be loaded.
flags –
Flags specifying the color type of a loaded image:
CV_LOAD_IMAGE_ANYDEPTH - If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
CV_LOAD_IMAGE_COLOR - If set, always convert image to the color one
CV_LOAD_IMAGE_GRAYSCALE - If set, always convert image to the grayscale one
>0 Return a 3-channel color image.
Note In the current implementation the alpha channel, if any, is stripped from the output image. Use negative value if you need the alpha channel.
=0 Return a grayscale image.
<0 Return the loaded image as is (with alpha channel).