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

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之间,否则会抛出异常。
 

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用OpenCV中的cv::cvtColor函数将YUV422格式的raw图像换为RGB图像。具体的实现步骤如下: 1. 读取YUV422格式的raw图像数据,并将其存储在一个cv::Mat对象中。 2. 调用cv::cvtColor函数,将YUV422格式的图像换为RGB图像。函数的参数如下: cv::cvtColor(input_image, output_image, cv::COLOR_YUV2RGB_Y422); 其中,input_image为输入的YUV422格式的raw图像,output_image为输出的RGB图像,cv::COLOR_YUV2RGB_Y422为换的颜色空间。 3. 将换后的RGB图像保存到文件中,或者进行其他的处理。 下面是一个示例代码: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char** argv) { // 读取YUV422格式的raw图像数据 FILE* fp = fopen("input.yuv", "rb"); int width = 640; int height = 480; int channels = 2; // YUV422格式的通道数为2 Mat yuv_image(height, width * channels, CV_8UC1); fread(yuv_image.data, 1, width * height * channels, fp); fclose(fp); // 将YUV422格式的图像换为RGB图像 Mat rgb_image; cvtColor(yuv_image, rgb_image, COLOR_YUV2RGB_Y422); // 将换后的RGB图像保存到文件中 imwrite("output.jpg", rgb_image); return 0; } ``` 注意:在读取YUV422格式的raw图像数据时,需要按照图像的存储方式进行读取。YUV422格式的图像每个像素由一个Y值和一个UV值组成,存储方式为Y0 U0 Y1 V0,即先存储Y值,再存储UV值。因此,在读取数据时需要按照这种存储方式进行读取

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值