怎样在监控视频中加时间 我做个社区视频监控软件,其他的基本没问题了,但是我想在监控视频画面上加当时时间,不知怎么弄的?希望得到高手的指教 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己做的,还是使用其它公司的sdk? 这要看你是用什么方式来弄视频采集这一块。如果是用普通的设备,多数情况下可以通过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;} 是那种网络摄像头吗?如果是这样,他有控件或接口的,你只要按照 Demo 做或看他的 WEB 页代码应该就能用得 7788 了。 为什么WM_PAINT第一次绘制不显 什么样的http头请求是正确的? 高分求助:avi文件多线程或进程同时读写,急! 如何做一个用.torrent文件下载东西的BT下载器? 有人用过大恒公司视频卡做过二次开发的吗 为什么我的线程自己停下了 这是一个关于数据存放算法的问题 请教:什么是重叠I/O? 有关傅立叶变换的问题,请各位帮忙解答! vs2010做注册登录的界面,要实现注册的功能,想通过连接access数据库实现,连接数据库实现不了,求大神指导! VC中菜单文字太长,怎么换行 两个TCHAR数组如何比较,是否相等、
如果是用普通的设备,多数情况下可以通过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;
}
看他的 WEB 页代码应该就能用得 7788 了。