如何解决在 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
fileID = fopen(videoPath);
[headerInfo,~] = fread(fileID,[1,123392],'uint8');
[imageMatrix,count] = fread(fileID,[video.width,video.height],'uint16','b');
imagesc(imageMatrix')
现在图像看起来更好了,你至少可以看到刹车盘,但似乎更高的温度有某种偏移,这仍然是缺失的,因为图片是正确的。
此外,正如另一篇文章和文档所建议的那样,我从文件中读取的值与实际温度相差甚远。
我的问题
我是不是遗漏了一些重要的东西?有人能指出我正确的方向,在哪里看或如何从我的视频中获取实际温度?因为它与另一篇文章中的 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。