ISP【三】———— raw读取、不同格式图片差异

这篇博客介绍了如何使用MATLAB和C++读取RAW图像数据。MATLAB通过fread函数读取RAW文件,并使用reshape将数据转换为图像矩阵。C++中,利用ifstream以二进制模式打开RAW文件,读取内容到缓冲区,然后构造OpenCV的Mat对象进行显示。RAW格式图片包含原始传感器数据,未经过压缩,不同设备的RAW文件处理方式可能不同。博客还提及了RAW图片的大小和处理要求。
摘要由CSDN通过智能技术生成

part zero:

如何处理.raw格式数据,读取和转化

matlab读取raw图 (mark读取图片尺寸和位数均可设置,图片尺寸M,N,图片数据类型8bit,16bit改成uint16)

clear;
clc;
close all;
% 
% rotpath = imread('D:\matlab\ncc_ive_pc_diff\ncc_diff\nv21_test_dst_rotate90.raw'); %%1280*800 8bit 
% mesh(nv_rot);
% path= imread('C:\Users\Administrator\Desktop\nv21_test_dst_rotate90.raw'); %%1280*800 8bit 

[filename, pathname] = uigetfile('D:\matlab\ncc_ive_pc_diff\ncc_diff\nv21_test_dst_rotate90.raw', '读入图像');
f1 = fopen([pathname, filename], 'r');
data = fread(f1, 'uint8');
fclose(f1);
len = length(data);
k = len/(1280*800);
image = reshape(data, 800, 1280, k);
mesh(image);


[filename2, pathname2] = uigetfile('D:\matlab\ncc_ive_pc_diff\ncc_diff\nv21_test_src.raw', '读入图像');
f2 = fopen([pathname2, filename2], 'r');
data2 = fread(f2, 'uint8');
fclose(f2);
len2 = length(data2);
k2 = len2/(1280*800);
image2 = reshape(data, 800, 1280, k2);
figure(2);
mesh(image2);

image_diff = image2-image;
figure(3);
mesh(image_diff);

raw图像(本文是raw8),opencv的imread不支持直接读入,但可以通过c++的ifstream读入。

注意的一点是,读取时,mode要设置成std::ios::binary,即把raw图像当做二进制文件读入。

读取后,构造opencv mat,并显示出来,代码如下:

   // open raw data
    const std::string file_path = "/home/zhangshan/image/image.raw";
    std::ifstream fin;
    // 注意,这里要指定binary读取模式
    fin.open(file_path,  std::ios::binary);
    if (!fin) {
        std::cerr << "open failed: " << file_path << std::endl;
    }
	// seek函数会把标记移动到输入流的结尾
    fin.seekg(0, fin.end);
    // tell会告知整个输入流(从开头到标记)的字节数量
    int length = fin.tellg();
   	// 再把标记移动到流的开始位置
    fin.seekg(0, fin.beg);
    std::cout << "file length: " << length << std::endl;
    
    // load buffer
    char* buffer = new char [length];
    // read函数读取(拷贝)流中的length各字节到buffer
    fin.read(buffer, length);

    // construct opencv mat and show image
    cv::Mat image(cv::Size(1280, 800), CV_8UC1, buffer);
    cv::imshow("test", image);
    cv::waitKey();

part one:

raw格式图片是相机拍摄并记录下来的带有原始信息的视频或者图片,包含传感器元数据、传感器尺寸、颜色属性、配置文件等等信息,以方便后期对视频及图片做更大幅度的处理。几乎未经压缩,也完全没进行各种处理,与记录拍摄时“用户的相机设置信息”数据被一同保存下来。既然是原始文件,一定很大,对传输带宽、存储空间都有特别的要求,而且每个摄像机、照相机厂家对自己的原始文件(RAW)开放程度、记录方式等要求都不一样。

 

参考:https://zhuanlan.zhihu.com/p/129055040

part two:

不同图片格式的区别 

part three:

mipi raw与raw区别

part four: 

  uint8_t* speckle;
  cv::Mat speckle_image;
  if (speckle_file_extern == ".raw") {
    speckle = new uint8_t[kInWidth_g * kInHeight_g];
    ASSERT_NE(speckle, nullptr);
    FILE* fp = fopen(imagesPath.speckle_Path_.c_str(), "rb");
    ASSERT_NE(fp, nullptr);
    fread(speckle, 1, kInWidth_g * kInHeight_g, fp);
    fclose(fp);
  } else if (speckle_file_extern == ".bmp") {
    cv::Mat speckle_image_t = cv::imread(imagesPath.speckle_Path_, cv::IMREAD_ANYDEPTH);
    ASSERT_FALSE(speckle_image_t.empty());
    speckle_image = speckle_image_t.clone();
    speckle = speckle_image.data;
  }

  delete[] out_depth;
  if (ir_file_extern == ".raw")
    delete[] ir;
  if (speckle_file_extern == ".raw")
    delete[] speckle;

part five:

raw 参考blog:

[1]https://blog.csdn.net/qq_42261630/article/details/102922737

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大江东去浪淘尽千古风流人物

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

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

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

打赏作者

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

抵扣说明:

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

余额充值