常见的格式可以分为未压缩的原始像素格式和压缩的编码格式两大类。通常是未经压缩的裸数据(Raw Data),其具体格式取决于摄像头的传感器类型、硬件设计以及驱动配置。以下是常见的原始帧格式分类和说明:
一、未压缩的原始像素格式
这类格式直接输出摄像头传感器采集的原始数据,通常体积较大,但处理延迟较低。常见格式包括:
1. 传感器原始数据(RAW Bayer格式)
这是摄像头传感器直接输出的最原始数据格式,常见于MIPI CSI-2接口的摄像头(如手机、嵌入式摄像头):
- 格式特点:
- 每个像素仅包含单色信息(R、G或B),按Bayer模式排列(如RGGB、BGGR等)。
- 位深通常为8/10/12位(如RAW8、RAW10、RAW12)。
- 示例:
R G R G ... G B G B ... R G R G ... G B G B ...
- 后续处理:需通过ISP(图像信号处理器)进行去马赛克(Demosaic) 转换为RGB/YUV格式。
2. YUV格式
摄像头或ISP处理后输出的常见格式,广泛用于视频编码和实时传输:
- 子格式:
- YUV420:亮度(Y)全分辨率,色度(UV)为1/2水平和垂直分辨率。
- 平面模式(Planar):
YUV420P
(如I420),数据分为Y、U、V三个平面。 - 半平面模式(Semi-Planar):
NV12
(Y平面 + 交织的UV平面)。
- 平面模式(Planar):
- YUV422:色度分辨率更高,适合高质量视频(如YUY2、UYVY)。
- YUV444:色度无降采样(如YUV444P)。
- YUV420:亮度(Y)全分辨率,色度(UV)为1/2水平和垂直分辨率。
- 位深:通常为8位,部分高端摄像头支持10位(如YUV420_10LE)。
3. RGB格式
直接面向显示的格式,较少作为原始流传输(因数据量大):
- 常见格式:
- RGB24:每像素3字节(R/G/B各8位),如
RGB888
。 - BGR24:字节顺序为B-G-R(如OpenCV默认格式)。
- RGB565:16位格式(R:5位, G:6位, B:5位),用于嵌入式设备。
- RGB24:每像素3字节(R/G/B各8位),如
4. 特殊格式
- 灰度(Grayscale):单通道8位数据(仅Y分量)。
- JPEG压缩后的伪“原始流”:某些USB摄像头直接输出JPEG帧,但严格来说是压缩格式。
二、压缩的编码格式
为减少传输带宽,摄像头通常会对原始数据实时压缩后再输出。常见格式包括:
-
MJPEG (Motion-JPEG)
- 原理:将每一帧单独压缩为JPEG图像,形成视频流。
- 特点:兼容性好,但压缩率较低,带宽占用较高(适合局域网环境)。
- 示例:
MJPEG
(通过FFmpeg解码时需使用mjpeg
解码器)。
-
H.264/H.265
- 原理:基于帧间预测的高效视频编码,大幅减少带宽。
- 特点:广泛用于网络传输(如RTSP流),需专用解码器。
- 示例:
h264
、hevc
(H.265)。
三、如何确定摄像头的输出格式?
1. 查看摄像头规格书:
传感器型号和接口协议(如MIPI CSI-2、USB UVC)会明确支持的数据格式。
2. 使用工具查询(以Linux为例)
通过 Video4Linux2 (v4l2) 工具查看摄像头支持的格式:
v4l2-ctl --list-formats
输出示例:
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'YUYV' (YUYV 4:2:2)
Name : YUV 4:2:2 (YUYV)
Index : 1
Pixel Format: 'MJPG' (Motion-JPEG)
Name : MJPEG
3. 在代码中检测(FFmpeg)
使用FFmpeg打开摄像头时,可通过 AVStream->codecpar->codec_id
获取编码格式:
AVCodecParameters* codecParams = formatContext->streams[videoStreamIndex]->codecpar;
if (codecParams->codec_id == AV_CODEC_ID_H264) {
// 处理H.264流
} else if (codecParams->codec_id == AV_CODEC_ID_MJPEG) {
// 处理MJPEG流
}
四、格式对开发的影响
-
解码器选择
- 若摄像头输出
MJPEG
,需使用avcodec_find_decoder(AV_CODEC_ID_MJPEG)
初始化解码器。 - 若输出
H.264
,则需AV_CODEC_ID_H264
解码器。
- 若摄像头输出
-
带宽与性能
- 未压缩格式(如
YUYV
)需要更高带宽,适合本地处理。 - 压缩格式(如
H.264
)适合网络传输,但需解码计算资源。
- 未压缩格式(如
-
帧处理
YUV
格式可能需要转换为RGB
才能显示(使用libswscale
)。MJPEG
解码后直接得到YUV
或RGB
帧。
五、典型应用场景
格式 | 应用场景 |
---|---|
RAW Bayer | 需要ISP处理的场景(如手机摄像头、工业检测) |
YUV420/NV12 | 视频编码(H.264/H.265)、实时传输 |
RGB24 | 图像显示、计算机视觉算法(如OpenCV) |
YUV422/YUV444 | 高质量视频采集、医疗成像 |
总结
格式类型 | 常见格式 | 特点 | 适用场景 |
---|---|---|---|
未压缩原始格式 | YUYV、YUV420、RGB24 | 数据量大,低延迟 | 本地实时处理 |
压缩编码格式 | MJPEG、H.264、H.265 | 带宽低,需解码 | 网络传输(如RTSP、RTMP) |
摄像头原始帧格式的核心是未经压缩的像素数据,常见为RAW Bayer或YUV/RGB。具体格式需结合硬件和协议分析,在实际开发中,建议通过工具或代码检测摄像头的实际输出格式,并选择合适的解码和处理方式。