深度學習數據集(MNIST、CIFAR-10)常以二進制格式分發。本文以 CIFAR-10 為例(32×32 彩色圖,標籤 1 byte + 像素 3072 bytes),演示單圖/多圖的二進制寫入與讀取完整流程。
// 每條記錄 3073 bytes [label(1B)] [R(1024B)] [G(1024B)] [B(1024B)] // R/G/B 均為 row-major:前 32 bytes 為第 1 行
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);
vectorchs(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,與官方規格一致。讀回顯示圖像無失真。

mmap / MemoryMappedFile 避免重複拷貝。little-endian、通道順序、數據類型(uint8/float32)。std::filesystem 管理路徑,std::ofstream::binary 替代 FILE*。