You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matlab中获取14位热成像相机的未转换原始数据?

解决Matlab捕获14位热成像相机原始数据的方案

1. 配置视频输入对象获取原始缓冲区数据

Matlab的videoinput对象支持直接读取相机输出的原始未处理数据,关键是修改ReturnedColorSpace参数为'raw':

  • 创建视频输入对象(适配器根据系统调整,Windows用winvideo,Linux用linuxvideo):
vid = videoinput('winvideo', 1); % 第二个参数是相机设备ID
  • 设置返回原始数据格式:
set(vid, 'ReturnedColorSpace', 'raw');
  • 捕获原始帧并解析:
start(vid);
raw_frame = getsnapshot(vid);
stop(vid);

% 转换为16位数据(假设相机每像素用2字节存储14位数据)
raw_16bit = typecast(raw_frame, 'uint16');
% 提取14位有效数据(假设高14位有效,低2位为填充)
gray_14bit = bitshift(raw_16bit, -2);
% 转换为8位灰度图(可选)
gray_8bit = uint8((gray_14bit / 16383) * 255); % 16383 = 2^14 - 1

2. 直接读取相机设备文件(绕过Matlab图像管道)

如果上述方法无法获取原始数据,可以直接读取相机的底层设备文件,完全绕过Matlab的自动格式转换:

  • Windows系统:设备路径为\\.\Device\VideoX(X为相机编号,从0开始)
  • Linux系统:设备路径为/dev/videoX
    示例代码:
% Windows下读取示例,替换Video0为你的相机设备编号
fid = fopen('\\.\Device\Video0', 'r', 'ieee-le'); % ieee-le表示小端字节序
% 读取对应分辨率的原始字节(假设分辨率为640x480,每像素2字节)
raw_bytes = fread(fid, 640*480*2, 'uint8');
fclose(fid);

% 转换为16位数据并提取14位有效部分
raw_16bit = typecast(raw_bytes, 'uint16');
gray_14bit = bitand(raw_16bit, 16383); % 保留低14位,根据实际情况调整

3. 手动解析YUYV格式中的原始数据

如果相机确实将14位数据封装在YUYV格式中,可以提取Y分量并尝试还原原始数据:

vid = videoinput('winvideo', 1);
set(vid, 'ReturnedColorSpace', 'yuv');
yuv_frame = getsnapshot(vid);

% 提取Y通道(YUYV格式中第一通道为Y)
y_channel = yuv_frame(:,:,1);
% 若14位数据被拆分为相邻两个Y字节,拼接为16位数据
raw_bytes = reshape(y_channel', [], 1);
raw_16bit = typecast(raw_bytes, 'uint16');
gray_14bit = bitand(raw_16bit, 16383);

关键提示

  • 不同相机的14位数据存储方式可能不同,需确认是高14位还是低14位有效,以及字节序(大端/小端)。
  • 若Matlab自带工具受限,可使用OpenCV捕获原始数据后导入Matlab处理——Matlab支持直接调用OpenCV函数,或读取OpenCV保存的原始字节文件。

内容的提问来源于stack exchange,提问作者Daniel Celano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:12:47