最近在做视频检测,从回调函数中得到的图像数据不清楚是什么格式,查看图像信息头,biBitCount =16 ,biCompression =0,不知道是RGB16的格式 还是YUV格式??是YUV多少的???? 求高手赐教判断图像格式的方法!!!!

解决方案 »

  1.   

    就是你说的了,查看文件信息头。具体的我也去google一下
      

  2.   

    typedef struct tagBITMAP {
      LONG   bmType; 
      LONG   bmWidth; 
      LONG   bmHeight; 
      LONG   bmWidthBytes; 
      WORD   bmPlanes; 
      WORD   bmBitsPixel; 
      LPVOID bmBits; 
    } BITMAP, *PBITMAP; 
      

  3.   

    可否把这个头部信息发上来?
    从视频设备获取的图像数据不一定具有图像文件的格式,如BMP、JPEG、PNG等。
    一下是一些常见图像文件的头部标志:
    BMP: 0x00-0x01 "BM"
    JPEG:0x06-0x09 "JFIF"
    GIF: 0x00-0x02 "GIF"
    PNG: 0x01-0x03 "PNG"如果你知道图像的尺寸,也可以大概估算出每个像素占用多少bit
      

  4.   

     一个像素占2个字节,我已经知道了。可是一个字节占两个字节的格式有好多种,我对YUV这种格式比较生疏,不知道它的头文件应该是什么样子??????现在不知道怎么转成标准的灰度图!!!!!
      

  5.   

    看一下这里:
    http://xuyingpin.blogbus.com/logs/18115593.html
      

  6.   

    BMP文件的结构:
                   
                             文件头                          位图信息头
                           
                             色彩表                        位图阵列
    1. 文件头
    文件头含有位图文件的类型,大小,数据结构等信息,文件头由下面一个结构组成:
     typedef struct tagBITMAPFILEHEADER{//BMFH
       WORD  bfTupe;
       DWORD  bfSize;
       WORD   bfReserved1;
       WORD  bfReserved2;
       DWORD   bfOffBits;
    }BITMAPFILEHEADER;
    在上面结构中,每一个成员的含义解释是如下:
      bfType  表明位图文件的类型;
      bfSize   表明位图文件的大小,以字节为单位;
      bfReserved1  代表保留字,必须为0;
      bfReserved2   也是保留字,必须为0;
      bfOffBits   表明位图阵列的起始位置,也就是位图阵列相对于位图文件头的偏移量,以字节为单位;
    2. 位图信息头
    位图信息头含有DIB(device-independent bitmap)与设备无关位图的大小和颜色格式。信息头由下面一个结构组成:
       tyopedef  struct tagBITMAPINFOHEADER{
    DWORD biSize;
    LONG  biHeight;
    WORD  biplanes;
    WORD  biBitCount;
    DWORD  biCompression;
    DWORD  biSizeImage;
    LONG  biXPelsPerMeter;
    LONG  biYPelsPerMeter;
    DWORD  biClrUsed;
    DWORD  biClrImportant;
    }BITMAPINFOGEADER;
    以上每个字段的具体含义解释如下;
    biSize   代表BITMAPINFOGEADER结构所需要的字节数。
    biWidth,biHeigh 代表一象素为单位的BMP图象的宽度和高度。
    BiPlatles  给出输出设备的平面数,必须置为1。
    biBitCount   给出每个象数的位数。
    biCompress  表示该图象所用的压缩类型。
    biSizeImage 代表图象字节数
    biXPelsPerMeter 代表图象的水平分辨率(以目标设备的每米象素数为单位)。
    biYPelsPerMeter 代表图象的垂直分辨率(以目标设备的每米象素数为单位)。
    BiClrUsed 给出调色板中图象实际使用的颜色数。若此值为0,那么图象使用的颜色由biBitCount的值确定;若此值不为0,当bitBitCount的值小于16,则biClrUsed给出图形设备驱动程序或设备驱动程序将访问的实际使用的颜色数。当bitBitCount大于等于16,则biCirUsed给出用于优化调色板性能的参考色彩表的大小。
        BiClrImportant  给出对于图象显示来说是重要的颜色索引值。此值若为0,则所有颜色都是重要的。
    3. 色彩表
    色彩表定义了一个颜色表,用于说明图象中的颜色。它有若干个表项,每一个表项都由RGBQUAD结构定义了一种颜色,每一种颜色都可由红、绿、蓝三个基色的不同分量组合而成,RGBQUAD实际上描述了一种颜色的红、绿、蓝三色的分量。
    RGBQUAD结构定义如下:
     typedef struct tagRGBQUAD{//rgbq
    BYTE  rgbBlue;
    BYTE  rgbGreen;
    BYTE  rgbRed;
    BYTE  rgbReserved;
    }RGBQUAD;
    色彩表中表项的个数由biBitCount来定:
    当biBitCount=1、4、8时,色彩表分别有2,16,256个表项;若某点的象素值为n,则该象素的颜色为色彩表中的第n项所定义的颜色。
    当biBitCount=24时,色彩表表项为空;位图阵列的每3个字节表示一个象素,这3个字节直接定义了象素颜色中的蓝、绿、红的相对亮度。  
    在RGBQUAD定义的颜色中,兰色的亮度由rgbBlue定义,绿色亮度由rgbGreen定义,红色的亮度由rgbRed定义,rgbReserved必须为零。若某表项的值为:FF,00,00,那么他定义的颜色为纯蓝色。
    当biBitCount=16,32时,情况较为复杂,并不常用。4. 位图阵列
       位图阵列存放图象的所有象素值。当biBitCount=1、4、8时,位图阵列中每个象素的值是该象素颜色在色彩表中的索引序号。象素值与色彩表是紧密相关的,对于同样的一个位图图象,如果色彩表不一样,那位图阵列里的象素值也将不一样。下图是包含有4种颜色,16*4象素的色彩表与位图数据阵列的信息:
    色彩表
    颜色索引号 红色分量 绿色分量 蓝色分量
    0 255 255 0
    1 128 255 255
    2 0 255 128
    3 255 128 128
    位图数据阵列
    0 1 2 2 2 1 1 1 2 3 3 3 3 3 3 3
    2 2 2 2 0 0 0 0 0 0 0 0 0 0 2 2
    1 1 1 1 1 1 1 0 0 0 0 0 0 0 2 2
    2 2 2 2 3 3 3 3 3 3 1 1 1 1 0 0
    其中,位图阵列中的每个象素占用2个bits,其数据是象素颜色对应在色彩表中的索引号。图象列阵的产生方法是:从图象的左下脚开始逐行扫描图象,从左到右,从下到上,把图象的象素值全部记录下来。位图列阵数据的存储格式有压缩和非压缩两种。由于我们用到的是非压缩格式,所以在此不介绍有压缩格式。
       在非压缩格式中,位图中每一个点的象素值对应于位图阵列的若干位,而位图阵列的大小由图象的宽度、高度及图象的颜色数(biBitCount)决定。
    4.1图扫描行与位图阵列的关系
    一个扫描行的象素值需要满足一定的要求,这种要求是每行的字节数必须为4的倍数,不足的补零。若记录一个扫描行的象素值需要n个字节,那么公式为:
    当(biWidth*biBitCount)能被32整除时;
    n=(biWidth*biBItCount)/8。
    当(biWidth*biBitCount)不能被32整除时;
    n=((biWidth*biBitCount)/32)*4+4。
    比实际图象多出的象素其值要用0表示。位图阵列的大小为n*biHeight字节,位图阵列中第0—n-1个字节代表图象的第一个扫描的象素值,第 n—2n-1个字节代表图象的第二个行的象素值,…….,第(I-1)*n---I*n-1个字节代表图象的第I个扫描行的象素值。
    4.2位图象素值与位图阵列的对应关系
    以第I个扫描行为例,若第I扫描行的象素值的n个字节分别为:b0,b1….b(n-1),则根据表示一个象素值所需位数的不同,对应关系如下:
    当biBtCount=1时,一个象素值可用1比特(1位)表示。b0的第七位表示位图的第I扫描行的第1个象素值,第6位表示第2个象素值,….,第0位表示第8个象素值;b1第7位表示第I扫描行的第9个象素值, 第6位表示第10个象素值, 第5位表示第11个象素值,….。
    当biBtCount=4时,一个象素值可用4比特(4位)表示。b0的第7--4位表示位图的第I扫描行的第1个象素值,第3--0位表示第2个象素值, b1第7--4位表示第I扫描行的第3个象素值, 第3--0位表示第4个象素值,….。
    当biBtCount=8时,一个象素值可用8比特(8位)表示。b1表示位图的第I扫描行的第1个象素值, b2表示第I扫描行的第2个象素值,……。
    当biBtCount=24时,一个象素值可用24比特(24位)表示。b0,b1,b2表示位图的第I扫描行的第1个象素值, b3,b4,b5表示第I扫描行的第2个象素值,……。