我做个社区视频监控软件,其他的基本没问题了,但是我想在监控视频画面上加当时时间,不知怎么弄的?希望得到高手的指教

解决方案 »

  1.   

    自己做的,还是使用其它公司的sdk?
      

  2.   

    这要看你是用什么方式来弄视频采集这一块。
    如果是用普通的设备,多数情况下可以通过VFW或DirectShow来实现,
    对于VFW的方式,可以设置捕获函数来取得要捕获的视频图像数据,然后
    再将数据换算成RGB数据放到GDI设备中,然后就可以像普通绘图一样在
    设备中绘制包含时间信息的字符串,然后再从GDI设备中把图像刷新到
    窗口设备上就实现你要的效果了,至于DirectShow操作方法有些不同,
    需要基于DX相关的COM接口进行对象式的处理,具体的在DirectX SDK
    中有相关范例,不过相对代码量和学习难度来说,VFW的方式要简单很多,
    你可以参考一下我博客里的内容:
    http://blog.csdn.net/SupermanKing/archive/2008/11/02/3207341.aspx
    不过这种方式会根据不同的摄像头返回不同色彩系统的数据,我提供的
    范例是我的一个 RGB 色彩系统的家用摄像头,有驱动的,不过现在市场
    上的很多摄像头都是没驱动的,采用的是YUY2色彩系统,这样一来就需要
    转换一下色彩系统的数据,至于转换过程,可以这样处理:long _stdcall YUY2toRGB( long PicW,
    long PicH,
    long YUY2ColorSize,
    long YUY2Size,
    long BitmapColorSize,
    long BitmapSize,
    BYTE * YUY2Bytes,
    BYTE * BitmapBytes,
    float PicHue,
    float PicBrightness,
    float PicSaturation)
    {
    long ColorR1 = 0;
    long ColorG1 = 0;
    long ColorB1 = 0;
    long ColorR2 = 0;
    long ColorG2 = 0;
    long ColorB2 = 0;
    long x = 0;
    long y = 0;
    long i = 0;
    long cY0 = 0;
    long cY1 = 0;
    long cU = 0;
    long cV = 0;
    long BitmapBytesX = 0;
    long BitmapBytesY = 0;
    long BitmapByteWidthSize = 0; long YUVBytesX = 0;
    long YUVBytesY = 0;
    long YUY2ByteWidthSize = 0;
    long RGBGray = 0;
    long rs = 0;
    float RGBScale = 0; YUY2ByteWidthSize = PicW * YUY2ColorSize;
    BitmapByteWidthSize = PicW * BitmapColorSize;
    if(BitmapByteWidthSize%2!=0){
    BitmapByteWidthSize++;
    } for(y=0; y<PicH; y++){
    for(x=0; x<PicW; x++){
    BitmapBytesX = x * BitmapColorSize;
    BitmapBytesY = y * BitmapByteWidthSize;
    if(YUY2ColorSize==2){
    YUVBytesX = x * YUY2ColorSize;
    YUVBytesY = y * YUY2ByteWidthSize;
    cY0 = YUY2Bytes[YUVBytesY + YUVBytesX];
    cU  = YUY2Bytes[YUVBytesY + YUVBytesX + 1];
    cY1 = YUY2Bytes[YUVBytesY + YUVBytesX + 2];
    cV  = YUY2Bytes[YUVBytesY + YUVBytesX + 3] ;
    if(cY0>255){ cY0=255; }else if(cY0<0){ cY0=0; }
    if(cY1>255){ cY1=255; }else if(cY1<0){ cY1=0; } cY0 = cY0 - 16;
    cY1 = cY1 - 16;
    cU = cU - 128;
    cV = cV - 128; ColorR1 = (long)((cY0 * 298 + cV * 409 + 128)>>8);
    ColorG1 = (long)((cY0 * 298 - cU * 100 - cV * 208 + 128)>>8);
    ColorB1 = (long)((cY0 * 298 + cU * 516 + 128)>>8); ColorR2 = (long)((cY1 * 298 + cV * 409 + 128)>>8);
    ColorG2 = (long)((cY1 * 298 - cU * 100 - cV * 208 + 128)>>8);
    ColorB2 = (long)((cY1 * 298 + cU * 516 + 128)>>8);
    //基本能用的 YUY2 算法
    BitmapBytes[BitmapBytesY + BitmapBytesX] = (BYTE)ColorB1;
                 BitmapBytes[BitmapBytesY + BitmapBytesX + 1] = (BYTE)ColorG1;
                 BitmapBytes[BitmapBytesY + BitmapBytesX + 2] = (BYTE)ColorR1;
                 BitmapBytes[BitmapBytesY + BitmapBytesX + 3] = (BYTE)ColorB2;
    BitmapBytes[BitmapBytesY + BitmapBytesX + 4] = (BYTE)ColorG2;
    BitmapBytes[BitmapBytesY + BitmapBytesX + 5] = (BYTE)ColorR2;
    x++;
    }else if(YUY2ColorSize>=3){
    YUVBytesX = x * YUY2ColorSize;
                 YUVBytesY = (PicH - (y + 1)) * YUY2ByteWidthSize;
                 for(i=0; i<YUY2ColorSize; i++){
                    BitmapBytes[BitmapBytesY + BitmapBytesX + i] = YUY2Bytes[YUVBytesX + YUVBytesY + i];
                 }
    }
    }
    }
    return 0;
    }
      

  3.   

    是那种网络摄像头吗?如果是这样,他有控件或接口的,你只要按照 Demo 做或
    看他的 WEB 页代码应该就能用得 7788 了。