C# 海康监控SDK与Emgu混合编程(二)
(2016-10-27 15:09:56)
标签:
emguc海康sdkyuvyv12 |
分类: 机器视觉 |
在上一篇文章:C#
1、打开海康SDKC#开发示例2
回调函数 DecCallbackFUN 是我们重点编码的位置
2、将海康SDK 获取的YUV数据转码为 GBR 数据并在 IMAGEBOX上显示。
写代码前请先浏览yuv420p转为emgucv的图像格式Emgu.CV.Image - jhlong -
博客园
第一步:建立缓冲区,存放YUV数据
int bufLen
=
为什么开辟这么大的缓冲区,在YUV420中,一个像素点对应一个Y,一个4X4的小方块对应一个U和V。对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像。YUV420sp与YUV420p的数据格式它们的UV排列在原理上是完全不同的。420p它是先把U存放完后,再存放V,也就是说UV它们是连续的。而420sp它是UV、UV这样交替存放的有了上面的理论,我就可以准确的计算出一个YUV420在内存中存放的大小。
width * hight =Y(总和) U = Y / 4 V = Y / 4 所以YUV420 数据在内存中的长度是 width * hight * 3 /
2。具体解释请移步到详解YUV数据格式 - lucky_greenegg的专栏 - 博客频道 -
CSDN.NET
第二步:将海康SDK 提供的YUV数据指针转换为btye数组
byte[] byteYUVBuf=new byte[bufLen];
Marshal.Copy(pBuf, byteYUVBuf, 0, bulLen);
第三步:调用 openCV函数进行转换
GCHandle handle = GCHandle.Alloc(byteYUVBuf,
GCHandleType.Pinned);
Emgu.CV.Image image = new Image(pFrameInfo.nWidth , pFrameInfo.nHeight );
using (Image yuv420p = new Imagebyte>(pFrameInfo.nWidth , (pFrameInfo.nHeight >> 1) * 3, pFrameInfo.nWidth ,
handle.AddrOfPinnedObject()))
{
}
具体内容请移步:yuv420p转为emgucv的图像格式Emgu.CV.Image - jhlong -
博客园
特别感谢提供相关经验的各位大牛。