利用 C 读取照片 RAW 数据的一些注意点:
- 搞清楚文件的数据类型(我的数据是12位的,所以用16位读取,转成8位,方便 opencv 显示数据)
- 利用 fopen 打开文件
- 利用 fread 读取文件(注意第二个和第三个参数的乘积是文件的大小即可)
- 弄懂指针在矩阵数据中的应用(本文用了一维指针,raw[i] 和 *(raw+i)都表示第 i 个元素的值
- 动态分配内存(因为你的数据大小可能随着不同的图片尺寸的变化而变化),用完释放内存,给野指针赋值
代码如下所示:
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std;
using namespace cv;
#define WIDTH 1920 //数字图像水平像素个数
#define HEIGHT 1080 //数字图像竖直像素个数
/******************************************************************************
* 功 能:打开文件
* 参 数:FilePath I 文件地址
pData I 文件缓存指针
raw I/O 照片 raw 数据指针
* 返回值:1:正常退出;0:报错
******************************************************************************/
int OpenFile(const char *FilePath,
unsigned short *pData,
unsigned char *raw);
int OpenFile(const char *FilePath,
unsigned short *pData,
unsigned char *raw)
{
FILE *fp; //文件指针
int i = 0; //循环变量
fp = fopen(FilePath, "rb");
if (NULL == pData)
{
/*如果没有输入数据则报错*/
printf("读取数据失败\n");
return 0;
}
fread(pData, 2, WIDTH * HEIGHT, fp);
for (i = 0; i < HEIGHT * WIDTH; i++)
{
raw[i] = pData[i] >> 4;
}
fclose(fp); //关闭文件夹
return 1;
}
void main()
{
/**************************为数据分配动态内存***************************/
unsigned short *pData = (unsigned short *)malloc(sizeof(unsigned short) * WIDTH * HEIGHT); //为原始照片数据分配内存
unsigned char *raw = (UC08 *)malloc(sizeof(UC08) * WIDTH * HEIGHT);
/******************************初始化数据******************************/
memset(pData, 0, sizeof(UC08) * WIDTH * HEIGHT);
memset(raw, 0, sizeof(UC08) * WIDTH * HEIGHT);
/*******************************读取 raw 数据**************************/
char cOpenFilePath[] = "你的数据路径";
OpenFile(OpenFilePath, pData, raw);
Mat temp1(1080, 1920, CV_8UC1, raw);
imwrite("图片储存路径和名称", temp1);
printf("读取数据完成\n\n");
/*****************************释放动态分配的内存************************/
free(pData);
free(raw);
/*****************************为野指针赋空值****************************/
pData = NULL;
raw = NULL;
return;
}
参考资料:
《C Primer Plus (第6版) 中文版》
C 语言 fopen 函数:https://baike.baidu.com/item/c%E8%AF%AD%E8%A8%80fopen%E5%87%BD%E6%95%B0/1775995?fr=aladdin