vfw视频捕获数据处理

vfw视频捕获数据处理

             从自己的百度空间拿过来的

            最近项目需要,看了相关vfw的一些东西,自己是在看别人的代码,没有特别深入的研究,不过自己所需要的已经实现。我不想写的很冗长,需要的东西,我会贴一些链接。

  1. 什么是vfw

    简单说来VFW(Video for Windows)就是Microsoft推出的关于数字视频的一个VFW软件开发包,这个库已经比较老了,目前用的是DirectShow,DirectShow是微软在VFW基础上,基于COM(组件编程)的视频流软件开发包。我感觉这个比较老了,要被替代了。

  2. 如何快速捕获摄像头并显示

    http://gui323.blog.51cto.com/3168443/957028这一个讲的是一个系列的,但是不甚清楚。

    http://wenku.baidu.com/view/d3dd79d9d15abe23482f4d5b   这一个讲的比较清楚。

    简答的说来就是通过vfw库函数创建窗口,并获得窗口句柄。这个是MFC下的,所以说整套都是在windows下的。

  3. 获取摄像头的格式的不同

    根据摄像头的不同,可以获取多种格式,我遇到的是两种:YUV,RGB,一般意义上是RGB(个人了解)。我没学过多媒体技术,所以这些是我自己所查所了解的。YUV和RGB的不同点在什么地方呢?主要在存储格式上。RGB的存储的话我们很好理解,一个像素点一个三个数据,R,G,B,这个应该很清楚吧。我们可以通过VFW捕获的帧数据,来说明白RGB格式。vfw捕获的帧数据,我捕获的是bmp格式的。bmp格式这里可以简单的说一下。bmp存储分为两部分:头文件数据结构,像素信息区域。头文件数据结构主要存储了bmp图像信息。比较重要的用红字标出。

    A. BMP文件头(14字节)

    BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。

    其结构定义如下:

    typedef struct tagBITMAPFILEHEADER
     
    {
     
    WORD bfType; // 位图文件的类型,必须为BM(1-2字节)
     
    DWORD bfSize; // 位图文件的大小,以字节为单位(3-6字节)
     
    WORD bfReserved1; // 位图文件保留字,必须为0(7-8字节)
     
    WORD bfReserved2; // 位图文件保留字,必须为0(9-10字节)
     
    DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(11-14字节)
     
    // 文件头的偏移量表示,以字节为单位
     
    } BITMAPFILEHEADER;


    B. 位图信息头(40字节)

    BMP位图信息头数据用于说明位图的尺寸等信息。 

    typedef struct tagBITMAPINFOHEADER{
        DWORD biSize; // 本结构所占用字节数
        LONG biWidth; // 位图的宽度,以像素为单位
        LONG biHeight; // 位图的高度,以像素为单位
        WORD biPlanes; // 目标设备的级别,必须为1
    
        WORD biBitCount;// 每个像素所需的位数,必须是1(双色),
                                     // 4(16色),8(256色)或24(真彩色)之一
        DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
                                               // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
        DWORD biSizeImage; // 位图的大小,以字节为单位
        LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
        LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
        DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
        DWORD biClrImportant;// 位图显示过程中重要的颜色数
    } BITMAPINFOHEADER;


    C. 下面就是数据区域了,数据区域就是按R,G,B数组存储的。

    有一点需要注意的是,BMP文件的图像深度可选lbit、4bit、8bit及24bit。以24bit为例,一个像素点需要24位存储,那R,G,B分别需要8bit,一个字节。请记住:bmp文件图像的扫描方式是按从左到右、从下到上的顺序。这个在你对图像数据处理时会特别有用,图像切割,重叠等操作。

    获取摄像头的图像格式不同

    vfw获取的摄像头存在两种格式:RGB,YUV,这个在vfw通过回调函数返回的数据指针中,可以查询。

    RGB格式比较清晰,位图信息头都很正常,但是YUV就很奇怪,YUV显示的biCompression= 844715353。

    YUV存储格式为:YUV 4:4:4,YUV 4:2:2,YUV 4:1:1,YUV4:2:0,

    这里主要说一下YUV 4:2:2结构方式,4个像素Y0 U0 Y1 V1 Y2 U2 Y3 V3,读取的方式为:[Y0 U0 V0] [Y1 U0 V0] [Y2 U1 V1] [Y2 U1 V1] [Y3 U2 V2]...。Y0,U0,V0做为一个点(类似于RGB),在我抓取的数据中LPVIDEOHDR结构类型,显示的biCompression= 844715353。

    内存布局如下,每像素 16 位。所以LPVIDEOHDR结构类型显示biBitCount=16

    在处理的时候,你会发现,YUV2的两个像素内存存储为[Y0 U0 Y1 V0](16*2 bit)相当于RGB的两个像素(24*2),也就是说,YUV2:RGB=2:3.这也就可以理解LPVIDEOHDR结构类型中为什么data长度为什么会是同等像素的RGB的2/3了。

  4. 帧数据压缩利用的是H.263.

    这个压缩算法的已经算是很老的了,另外目前用的比较多的是H.264。H.263编解码的输入时YUV格式的数据,YUV格式数据适合图像处理。对于需要编解码的应用来说的话,如果采集的是不适合的YUV格式数据,可以采用YUV转RGB,然后再转为YUV,这样可能有些绕,而且有些笨的方法。不过我是这么做的,编解码比较耗费资源。建议有了解多媒体技术的可以采用其他方式。

  5. YUV和RGB 的相互转化

    这个比较简单,晚上资料一大堆,需要注意的是相互转化的话,YUV转RGB的话,可能会有小于0或者大于255的情况产生。

欢迎一起讨论进步。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值