首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 圖像二進制存儲與讀取:以 CIFAR-10 格式為例

     編輯:關於C++

深度學習數據集(MNIST、CIFAR-10)常以二進制格式分發。本文以 CIFAR-10 為例(32×32 彩色圖,標籤 1 byte + 像素 3072 bytes),演示單圖/多圖的二進制寫入與讀取完整流程。

一、CIFAR-10 二進制佈局

// 每條記錄 3073 bytes
[label(1B)] [R(1024B)] [G(1024B)] [B(1024B)]
// R/G/B 均為 row-major:前 32 bytes 為第 1 行

二、單圖寫入(OpenCV Mat → bin)

FILE* fp = fopen("patch.bin", "wb");
Mat img = imread("lena32.jpg"); // 32x32, 3通道
if (!img.data || img.channels()!=3) return;

int label = 1;
fwrite(&label, 1, 1, fp); // 寫標籤

// 直接寫入連續內存(OpenCV Mat 預設 BGR 連續存儲)
// 若需嚴格 RGB 順序,需分通道寫入
fwrite(img.data, 1, img.total()*img.channels(), fp);
fclose(fp);

三、嚴格按 RGB 通道分離寫入

vector chs(3);
split(img, chs); // chs[0]=B, [1]=G, [2]=R
fwrite(chs[2].data, 1, 1024, fp); // R
fwrite(chs[1].data, 1, 1024, fp); // G
fwrite(chs[0].data, 1, 1024, fp); // B

四、讀取並驗證

FILE* fp = fopen("patch.bin", "rb");
char label; fread(&label, 1, 1, fp);
Mat img2(32, 32, CV_8UC3);
fread(img2.data, 1, 3072, fp);
fclose(fp);
imshow("readback", img2); waitKey(0);

五、多圖批量存取

循環調用上述單圖邏輯即可。文件大小 = N * 3073 bytes。讀取時按記錄大小分塊 fread。

六、運行效果驗證

生成文件 patch.bin 大小 3073 bytes,與官方規格一致。讀回顯示圖像無失真。

二進制佈局示意圖 讀回圖像 文件屬性 3073 bytes

七、工程建議

  1. 大規模數據集建議用 mmap / MemoryMappedFile 避免重複拷貝。
  2. 跨語言(Python/Go/C++)共享時,約定好 little-endian、通道順序、數據類型(uint8/float32)。
  3. C++17 可用 std::filesystem 管理路徑,std::ofstream::binary 替代 FILE*。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved