当前位置: 首页 > 工具软件 > RAW > 使用案例 >

10_OpenCV读取原始raw(raw10和raw8),转换成rgb和灰度图,并显示

史绍晖
2023-12-01
void ReadRaw8(){
	std::string strFilename = "raw8.raw";
	int nWidth = 1456;
	int nHeight = 1096;

	uint8_t* pRawbuf = new uint8_t[(size_t)nWidth * nHeight];
	if (!pRawbuf) {
		std::cout << "ERROR: 开辟内存失败!" << std::endl;
		return;
	}
	FILE* pfile = nullptr;
	errno_t err_code = fopen_s(&pfile, strFilename.c_str(), "rb");
	if (!pfile)
	{
		std::cout << "ERROR: 打开文件失败!" << std::endl;
		return;
	}
	fread(pRawbuf, 1, ((size_t)nWidth * nHeight), pfile);
	fclose(pfile);
	pfile = nullptr;

	cv::Mat img(nHeight, nWidth, CV_8UC1, pRawbuf);
	cv::namedWindow(strFilename, cv::WINDOW_NORMAL);
	cv::imshow(strFilename, img);
	cv::waitKey(0);
	cv::Mat rgb;
	cv::Mat gray;
	cv::cvtColor(img, rgb, cv::COLOR_BayerRG2RGB);
	cv::imshow(strFilename, rgb);
	cv::waitKey(0);

	cv::cvtColor(rgb, gray, cv::COLOR_RGB2GRAY);
	cv::imshow(strFilename, gray);
	cv::waitKey(0);
}

void ReadRaw10(){
	// 读取raw10图片
	std::string strFilename = "raw10.raw";
	int nWidth = 4208;
	int nHeight = 3120;
	short* pRaw10buf = new short[(size_t)nWidth * nHeight];
	if (!pRaw10buf)
	{
		std::cout << "ERROR: 开辟内存失败!" << std::endl;
		return;
	}
	FILE* pfile = nullptr;
	errno_t err_code = fopen_s(&pfile, strFilename.c_str(), "rb");
	if (!pfile) {
		std::cout << "ERROR: 打开文件失败!" << std::endl;
		return;
	}
	fread(pRaw10buf, sizeof(pRaw10buf[0]), (size_t)nWidth * nHeight, pfile);
	fclose(pfile);
	pfile = nullptr;

	cv::Mat raw10Img(nHeight, nWidth, CV_16SC1, pRaw10buf);
	cv::namedWindow(strFilename, cv::WINDOW_NORMAL);
	cv::imshow(strFilename, raw10Img);
	cv::waitKey(0);
    //  以下运行会崩溃,因为rgb和gray都是8U类型的数据,而raw10Img是16S,数据溢出,因此需要转换位raw8之后再转成RGB或BGR图像
    cv::Mat img_raw8;
	cv::convertScaleAbs(img, img_raw8, 0.25);
	cv::imshow(strFilename, img_raw8);
	cv::waitKey(0);

	cv::Mat rgb;
	cv::Mat gray;
	cv::cvtColor(img_raw8, rgb, cv::COLOR_BayerRG2RGB);
	cv::imshow(strFilename, rgb);
	cv::waitKey(0);

	cv::cvtColor(rgb, gray, cv::COLOR_RGB2GRAY);
	cv::imshow(strFilename, gray);
	cv::waitKey(0);
}

需要注意的是:

1. 在debug下运行可能会崩溃,改成release可以正常运行;
2. raw转rgb24时应该选择*2RGB,否则转换后的图片会偏色;
3. 读取raw10图片后如果要转成RGB或BGR图像,需要先转成raw8格式,即保证每个像素的值在0~255之间,否则会抛出异常。
 

 类似资料: