微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Matlab 中从 .ravi 文件中提取温度

如何解决在 Matlab 中从 .ravi 文件中提取温度

我的问题

很像这里的帖子:How can I get data from 'ravi' file?我有一个 .ravi 文件一个辐射视频文件,与 .avi 非常相似),我正在尝试提取其中的温度,以使用它们以及其他传感器数据。

当您下载“PIX Connect 软件”时,可以在文档 (http://infrarougekelvin.com/en/optris-logiciel-eng/) 中找到示例文件。不幸的是,根据文档,温度信息以 16 位格式存储,Matlab 似乎对此不太满意。

我如何尝试解决我的问题

我尝试按照之前提到的帖子中的说明进行操作,但不知何故我很难达到甚至接近正确温度的结果。Original Picture with temperatures in the Optris Software

我尝试用不同的方法阅读视频: 起初我希望使用 Matlab 中的 videorecorder Feature:

video   = VideoReader(videoPath);
frame1  = video.read(1);
imagesc(frame1)

但它只会导致这张糟糕的图片,这正是我所看到的,当我尝试在像 vlc 这样的媒体播放器中播放 .ravi 文件时。

First try with videorecorder function

然后我尝试查看我的文件的二进制表示并注意到,我可以在某个标记处分隔帧 Beginning of a new frame in binary representation

所以我尝试用 matlab fread 函数读取文件

fileID               = fopen(videoPath);    
[headerInfo,~]       = fread(fileID,[1,123392],'uint8');
[imageMatrix,count]  = fread(fileID,[video.width,video.height],'uint16','b');
imagesc(imageMatrix')

现在图像看起来更好了,你至少可以看到刹车盘,但似乎更高的温度有某种偏移,这仍然是缺失的,因为图片是正确的。

此外,正如另一篇文章和文档所建议的那样,我从文件中读取的值与实际温度相差甚远。

Getting somewhere!

我的问题

我是不是遗漏了一些重要的东西?有人能指出我正确的方向,在哪里看或如何从我的视频中获取实际温度?因为它与另一篇文章中的 cpp 代码一起工作,所以我猜这可能是一个 matlab 问题。

解决方法

获取原始帧数据的一个相对简单的解决方案是将 RAVI 视频文件转换为原始视频文件格式。

您可以使用 FFmpeg(命令行工具)将 RAVI 格式转换为 RAW 格式。

示例:

ffmpeg -y -f avi -i "Sequence_LED_Holder.ravi" -vcodec rawvideo "Sequence_LED_Holder.yuv"

YUV(原始二进制数据)文件,MATLAB 可以使用 fread 函数轻松读取。
注意:.yuv 只是原始视频文件的约定(由 FFmpeg 使用) - 实际像素格式不是 YUV,而是 int16 格式。

您可以尝试手动解析 RAVI 文件,但使用 FFmpeg 要简单得多。

原始文件格式由一个接一个的原始视频帧组成,没有标题。
在我们的例子中,每帧是 width*height*2 字节。
像素类型为 int16(可能包含负值)。

红外视频帧没有颜色信息。
颜色只是使用调色板创建并用于可视化的“假色”。
代码示例使用了来自不同 IR 相机制造商的调色板。

获取温度:
我找不到将像素值转换为等效温度的方法。
我没有阅读文档 - 有可能在某处记录了转换。


MATLAB 代码示例应用以下阶段:

  • 使用 FFmpeg 将 RAVI 文件格式转换为 RAW 视频文件格式。
  • 将视频帧读取为 [cols,rows] 大小 int16 矩阵。
  • 删除可能包含数据(不是像素)的第一行。
  • 使用线性对比度拉伸 - 用于可视化。
  • 应用假色 - 用于可视化。
  • 显示处理后的视频帧。

这是代码示例:

%ravi_file_name = 'Brake disc.ravi';
%ravi_file_name = 'Combustion process.ravi';
%ravi_file_name = 'Electronic board.ravi';
%ravi_file_name = 'Sequence_carwheels.ravi';
%ravi_file_name = 'Sequence_drop.ravi';
ravi_file_name = 'Sequence_LED_Holder.ravi';
%ravi_file_name = 'Steel workpiece with hole.ravi';

yuv_file_name = strrep(ravi_file_name,'.ravi','.yuv'); % Same file name with .yuv extension.

% Get video resolution.
vidinfo = mmfileinfo(ravi_file_name);
cols = vidinfo.Video.Width;
rows = vidinfo.Video.Height;


% Execute ffmpeg (in the system shell) for converting RAVI to raw data file.
% Remark: download FFmpeg if needed,and make sure ffmpeg executable is in the execution path.
if ~exist(yuv_file_name,'file')
    % Remark: For some of the video files,cmdout returns a string with lots of meta-data 
    [status,cmdout] = system(sprintf('ffmpeg -y -f avi -i "%s" -vcodec rawvideo "%s"',ravi_file_name,yuv_file_name));
    if (status ~= 0)
        fprintf(cmdout);
        error(['Error: ffmpeg status = ',num2str(status)]);
    end
end

% Get the number of frames according to file size.
filesize = getfield(dir(yuv_file_name),'bytes');
n_frames = filesize / (cols*rows*2);

f = fopen(yuv_file_name,'r');

% Iterate the frames (skip the last frame).
for i = 1:n_frames-1
    % Read frame as cols x rows and int16 type.
    % The data is signed (int16) and not uint16.
    I = fread(f,[cols,rows],'*int16')';
  
    % It looks like the first line contains some data (not pixels).
    data_line = I(1,:);
    I = I(2:end,:);
    
    % Apply linear stretch - in order to "see something"...
    J = imadjust(I,stretchlim(I,[0.02,0.98]));
    
    % Apply false colors - just for visualization.
    K = ColorizeIr(J);

    if (i == 1)
        figure;
        h = imshow(K,[]); %h = imshow(J,[]);
        impixelinfo
    else
        if ~isvalid(h)
            break;
        end
        h.CData = K; %h.CData = J;
    end
    
    pause(0.05);
end

fclose(f);

imwrite(uint16(J+2^15),'J.tif'); % Write J as uint16 image.
imwrite(K,'K.png'); % Write K image (last frame).



% Colorize the IR video frame with "false colors".
function J = ColorizeIr(I)
    % The palette apply different IR manufacture - don't expect the result to resemble OPTRIS output.
    % https://groups.google.com/g/flir-lepton/c/Cm8lGQyspmk
    colormapIronBlack = uint8([...
        255,255,253,251,249,247,...
        247,245,243,241,239,237,...
        237,235,233,231,229,...
        227,227,225,223,221,219,...
        219,217,215,213,211,209,...
        209,207,205,203,201,...
        199,199,197,195,193,191,...
        191,189,187,185,183,181,...
        181,179,177,175,173,...
        171,171,169,167,165,163,...
        163,161,159,157,155,153,...
        153,151,149,147,145,...
        143,143,141,139,137,135,...
        135,133,131,129,126,124,...
        124,122,120,118,116,...
        114,114,112,110,108,106,...
        106,104,102,100,98,96,...
        96,94,92,90,88,86,84,...
        84,82,80,78,76,74,72,...
        72,70,68,66,64,62,60,...
        60,58,56,54,52,50,48,...
        48,46,44,42,40,38,36,...
        36,34,32,30,28,26,24,...
        24,22,20,18,16,14,12,...
        12,10,8,6,4,2,9,...
        2,31,45,53,17,67,19,21,23,89,25,27,103,...
        29,111,41,121,51,123,...
        56,61,125,71,127,1,128,81,...
        86,130,91,132,101,134,136,3,...
        139,138,144,158,5,...
        5,140,172,7,186,...
        141,13,194,196,198,...
        116,200,95,37,...
        90,212,85,214,43,216,75,218,49,69,...
        223,55,59,224,57,47,226,228,...
        71,39,230,29,232,...
        27,234,99,236,...
        238,109,240,119,...
        241,242,...
        244,244,152,156,246,160,...
        246,248,178,15,...
        249,182,250,192,...
        251,252,206,210,...
        254,254,220,...
        255,238,...
        193,24]);
    
    lutR = colormapIronBlack(1:3:end);
    lutG = colormapIronBlack(2:3:end);
    lutB = colormapIronBlack(3:3:end);
    
    % Convert I to uint8
    I = im2uint8(I);
    R = lutR(I+1);
    G = lutG(I+1);
    B = lutB(I+1);
    
    J = cat(3,R,G,B);
end

样本输出:
enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。