1. 程式人生 > >Raw資料讀取以及轉換為Mat

Raw資料讀取以及轉換為Mat

Raw資料介紹:

RAW的原意就是“未經加工”。可以理解為:RAW影象就是CMOS或者CCD影象感應器將捕捉到的光源訊號轉化為數字訊號的原始資料。RAW檔案是一種記錄了數碼相機感測器的原始資訊,同時記錄了由相機拍攝所產生的一些元資料(Metadata,如ISO的設定、快門速度、光圈值、白平衡等)的檔案。RAW是未經處理、也未經壓縮的格式,可以把RAW概念化為“原始影象編碼資料”或更形象的稱為“數字底片”。RAW格式的全稱是RAW Image Format,在程式設計中稱之為原始。

把Raw資料轉化為三通道Mat資料

void RawToMat(const char filename[], cv::Mat& dst,int width=1024,int height=1024)
{
	size_t nsize = width*height;
	unsigned short *data = new unsigned short[nsize];
	if (data == NULL)
	{
		std::cout << "data space malloc failed" << std::endl;
	}
	FILE *file;
	//	fopen_s(&file, fileName, "rb+");
	file = fopen(filename, "rb+");
	fread(data, sizeof(unsigned short), nsize, file);
	fclose(file);
	cv::Mat temp(height, width, CV_16UC1, data);//單通道的Mat raw資料
	cv::Mat mtep[3];
	temp.copyTo(mtep[0]);
	temp.copyTo(mtep[1]);
	temp.copyTo(mtep[2]);

	cv::Mat mergeM(height, width, CV_16UC3);
	cv::merge(mtep, 3, mergeM);
	mergeM.convertTo(dst, CV_32FC3);
	delete[] data;
        return;
}
記錄一下,我想,應該可以不通過
unsigned short *data = new unsigned short[nsize];
作為中介轉換資料,可以直接把資料讀入mat的data中去。沒有除錯,所以僅作猜想。如果可以直接存入,可以節約一些時間。