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

如何将HV6000IE卡的H.264帧字节数组读取到EMGU CV

H.264字节流转Emgu CV Mat并显示解决方案

核心实现逻辑

通过Emgu CV封装的OpenCV视频解码能力,处理采集卡输出的H.264裸流(含I帧、P帧),将解码后的图像转为Mat对象,最终绑定到Emgu.CV.ImageBox控件显示。


C# 实现代码

using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;

// 初始化H.264解码器
var decoder = new VideoCapture();
// 启用内存缓冲区模式,支持从内存写入帧数据
decoder.SetCaptureProperty(CapProp.OpenCvIoEnableMemoryBuffer, 1);
// 设置解码格式为H.264
decoder.SetCaptureProperty(CapProp.Fourcc, VideoWriter.Fourcc('H', '2', '6', '4'));

// 替换为从DVR采集卡获取的单帧H.264字节数组(需包含完整帧起始码)
byte[] h264FrameBytes = GetH264FrameFromDVR();

// 将字节流写入解码器
decoder.Write(h264FrameBytes);

// 读取解码后的图像Mat
var frameMat = new Mat();
if (decoder.Read(frameMat))
{
    // 转换为Image对象并绑定到ImageBox(ImageBox也可直接绑定Mat)
    var displayImage = frameMat.ToImage<Bgr, byte>();
    imageBox1.Image = displayImage;
}

// 释放资源
frameMat.Dispose();
decoder.Dispose();

VB.NET 实现代码

Imports Emgu.CV
Imports Emgu.CV.CvEnum
Imports Emgu.CV.Structure

' 初始化H.264解码器
Dim decoder As New VideoCapture()
' 启用内存缓冲区模式
decoder.SetCaptureProperty(CapProp.OpenCvIoEnableMemoryBuffer, 1)
' 设置解码格式为H.264
decoder.SetCaptureProperty(CapProp.Fourcc, VideoWriter.Fourcc("H"c, "2"c, "6"c, "4"c))

' 替换为从DVR采集卡获取的单帧H.264字节数组
Dim h264FrameBytes As Byte() = GetH264FrameFromDVR()

' 将字节流写入解码器
decoder.Write(h264FrameBytes)

' 读取解码后的图像Mat
Dim frameMat As New Mat()
If decoder.Read(frameMat) Then
    Dim displayImage As Image(Of Bgr, Byte) = frameMat.ToImage(Of Bgr, Byte)()
    ImageBox1.Image = displayImage
End If

' 释放资源
frameMat.Dispose()
decoder.Dispose()

关键注意事项

  • 确保传入的H.264字节流是完整的单帧数据,需包含帧起始码(0x00000001或0x000001),否则解码器无法识别帧边界。
  • 若采集卡输出连续流数据,需先按帧分割后再喂入解码器,避免因数据粘连导致解码失败。
  • 若上述方法解码异常,可尝试手动调用OpenCV解码函数:
// C# 手动解码示例
var frameData = new Mat(1, h264FrameBytes.Length, DepthType.Cv8U, 1);
frameData.SetTo(h264FrameBytes);

var decodedFrame = new Mat();
CvInvoke.Decode(frameData, decodedFrame, ImreadModes.Color);

if (!decodedFrame.IsEmpty)
{
    imageBox1.Image = decodedFrame.ToImage<Bgr, byte>();
}

frameData.Dispose();
decodedFrame.Dispose();
  • 保证Emgu CV版本与依赖的OpenCV版本兼容,推荐使用4.x系列稳定版。
  • 解码前需确保解码器已获取到I帧,否则无法正确初始化解码上下文,会出现花屏或无图像情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:32:51