OPENCV批量读取raw图

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

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);
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

针织的毛衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值