提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
OPENCV批量读取raw图
本文记录了以二进制的形式批量读取文件夹中的raw图像,并用opencv显示图像
raw图链接
#include <opencv2\opencv.hpp>
#include <Windows.h>
#define BMP_HEADER_LEN 54
#define SAVEDATA 0 //设置为0 不保存csv ,设置非0 保存csv
cv::String imgName;
//读取BMP图像
unsigned char *ReadBmpData(char *imgName, int *width, int *height, int *imgType)
{
FILE *fpImg = NULL;
long int BmpLen = 0, BmpDataLen = 0, RawLen = 0;
unsigned char *InBmpBuf = NULL, *RawBuf = NULL, *RawTempBuf = NULL;
if ((fpImg = fopen(imgName, "rb")) == NULL)
{
printf("图像文件不存在!!!!!!!!!\n");
return(0);
}
fseek(fpImg, 0, 2);
BmpLen = ftell(fpImg); //图像的总长度
BmpDataLen = BmpLen - BMP_HEADER_LEN; //去除BMP头信息的字节后剩下的图像长度
rewind(fpImg);
BITMAPFILEHEADER bmfh; //位图文件头
BITMAPINFO bmi; //位图信息头
//读取文件头
fread(&bmfh, sizeof(bmfh), 1, fpImg);
printf("文件头信息:\n");
printf("文件类型:%c%c\n", bmfh.bfType % 256, bmfh.bfType / 256);
printf("文件大小:%d\n", bmfh.bfSize);
printf("图像数据偏移量:%d\n", bmfh.bfOffBits);
printf("BmpLen = %d, BmpDataLen = %d\n", BmpLen, BmpDataLen);
//读BMP信息头--------读彩色表
fread(&bmi, sizeof(BITMAPINFO), 1, fpImg);
printf("\n图像信息:\n");
printf("位图宽度:%d\n", bmi.bmiHeader.biWidth);
printf("位图高度:%d\n", bmi.bmiHeader.biHeight);
printf("每个像素的位数:%d\n", bmi.bmiHeader.biBitCount);
printf("位图数据的大小:%d\n", bmi.bmiHeader.biSizeImage);
printf("用像素/米表示的水平分辨率:%d\n", bmi.bmiHeader.biXPelsPerMeter);
printf("用像素/米表示的垂直分辨率:%d\n", bmi.bmiHeader.biYPelsPerMeter);
printf("每个像素的位数:%d\n", bmi.bmiHeader.biBitCount);
printf("位图使用的颜色数:%d\n", bmi.bmiHeader.biClrUsed);
printf("长*宽*3 = %d\n", bmi.bmiHeader.biWidth*bmi.bmiHeader.biHeight * 3);
rewind(fpImg);
*imgType = bmi.bmiHeader.biBitCount / 8;
InBmpBuf = (unsigned char *)malloc((sizeof(unsigned char)) * BmpLen);
memset(InBmpBuf, 0, BmpLen);
fread(InBmpBuf, 1, BmpLen, fpImg);
fclose(fpImg);
unsigned char *imgStartPos = InBmpBuf + BMP_HEADER_LEN;
int i, j, k = 0;
unsigned char *imgData = NULL;
imgData = (unsigned char *)malloc((sizeof(unsigned char)) * BmpDataLen);
memset(imgData, 0, BmpDataLen);
for (i = bmi.bmiHeader.biHeight - 1; i >= 0; i--)
//for(i=0; i<bmi.bmiHeader.biHeight; i++)
{
for (j = 0; j<bmi.bmiHeader.biWidth; j++)
{
imgData[k*bmi.bmiHeader.biWidth * 3 + j * 3] = imgStartPos[i*bmi.bmiHeader.biWidth * 3 + j * 3]; //b
imgData[k*bmi.bmiHeader.biWidth * 3 + j * 3 + 1] = imgStartPos[i*bmi.bmiHeader.biWidth * 3 + j * 3 + 1]; //g
imgData[k*bmi.bmiHeader.biWidth * 3 + j * 3 + 2] = imgStartPos[i*bmi.bmiHeader.biWidth * 3 + j * 3 + 2]; //r
}
k++;
}
printf("K = %d\n", k);
*width = bmi.bmiHeader.biWidth;
*height = bmi.bmiHeader.biHeight;
free(InBmpBuf);
return(imgData);
}
//读取RAW图像
unsigned char *ReadDataFromRAWFile(char *m_strFilePath, long *filesize)
{
FILE* fp;
fp = fopen(m_strFilePath, "rb");
if (fp == NULL)
{
printf("打开RAW文件失败!\n");
return NULL;
}
fpos_t startpos, endpos;
fseek(fp, 0, SEEK_END);
fgetpos(fp, &endpos);
fseek(fp, 0, SEEK_SET);
fgetpos(fp, &startpos);
long filelen = (long)(endpos - startpos);
unsigned char *bTemp = NULL;
bTemp = (unsigned char *)malloc(filelen);
if (bTemp == NULL)
{
fclose(fp);
return NULL;
}
memset(bTemp, 0, filelen);
fread(bTemp, filelen, 1, fp);
fclose(fp);
*filesize = filelen;
return bTemp;
}
int main()
{
int imgWidth = 4032;
int imgHeight = 3024;
int ret = 0;
int i = 0, j = 0, k = 0, offset = 0;
long imgFilesize = 0;
char imgFileName[300];
#if SAVEDATA
FILE *fp = fopen("FileInfo.csv", "a+");
#endif
cv::String imgPath = "4032x3024raw8\\*.raw";//换成自己的文件路径
std::vector<cv::String> imgList;
glob(imgPath, imgList, true);
int ngNum = 0;
//读RAW图
for (int index = 0; index < imgList.size(); index++)
{
memset(imgFileName, 0, sizeof(char) * 300);
imgName = imgList[index].c_str();
sprintf(imgFileName, imgList[index].c_str());
unsigned char *pTestImgBuf = NULL;
if (imgPath.rfind(".raw") != imgPath.npos)
{
pTestImgBuf = ReadDataFromRAWFile(imgFileName, &imgFilesize); //读取 Raw 图像
if (pTestImgBuf == NULL)
{
printf("读取图像失败!\n");
return(-1);
}
int iRAMTestFlag = 0, iFuncTimes = 0; //内存测试标识位,0--不进行内存测试;1--进行内存测试
DWORD startTick = GetTickCount(); //时间测试
cv::Mat src = cv::Mat(imgHeight,imgWidth,CV_8UC1,pTestImgBuf);
DWORD endTick = GetTickCount();
printf("函数运行时间为 %d ms.\n", (endTick - startTick));
#if SAVEDATA
fprintf(fp, "\n");//此处写入要保存到csv文件的数据
#endif
}
printf("\n");
free(pTestImgBuf); pTestImgBuf = NULL;
}
#if SAVEDATA
fclose(fp);
#endif
system("pause");
return (0);
}