Directshow & Opencv进行UVC开发
对于UVC(USB video class)的开发,使用较多的是由仕琪老师所写的CameraDS类。
实现的功能有:
1)查询UVC设备信息;
2)打开UVC设备;
3)读取帧数据;
本人在使用过程中基于该类进行了修改。打开UVC设备及读取帧数据部分改用了Opencv接口,查询UVC仍使用DirectShow接口。
原因是:
1)DirectShow接口读取帧数据会出现重复帧的情况。在读取帧数据失败的情况下,仍会把当前缓冲区的帧数据返回(上一帧),这对于上层计算帧率,检测当前状态造成困难。用Opencv则可以解决这个问题。
2)增加了视频录制和视频文件播放功能,这些都可以通过Opencv接口来实现的。
/*-----------------------------------------------------
获取系统下UVC设备列表
deviceCount: 返回设备个数;
return: 返回设备信息列表;
------------------------------------------------------*/
virtual Camera_Info *GetDeviceList(int &deviceCount);
/*-----------------------------------------------------
检查输入的VidPid设备是否存在
deviceVidPid: 输入VidPid;
return 如果存在,返回对应的index;否则返回-1;
------------------------------------------------------*/
virtual int CheckDeviceExist(const char *deviceVidPid);
/*-----------------------------------------------------
打开设备
devieceVidPid: 指定摄像头设备的vid和pid,格式如:vid_2929&pid_000e
videoFormat: 指定视频流的格式,默认为YUY2,可选MJPG_MODE ...
width: 指定视频帧的宽,默认320;
height: 指定视频帧的高,默认240;
return: -1(没有找到相关设备),0(打开设备失败),1(打开设备成功)
------------------------------------------------------*/
virtual int OpenCamera(const char *devieceVidPid, Video_Format videoFormat= YUY2_MODE, int width= 320, int height= 240);
/*-----------------------------------------------------
播放视频文件
path: 指定视频文件路径;
return: 0(打开失败),1(打开成功)
------------------------------------------------------*/
virtual int OpenFile(const char *path);
/*-----------------------------------------------------
关闭摄像头或停止视频播放,析构函数会自动调用这个函数
------------------------------------------------------*/
virtual void Close();
/*-----------------------------------------------------
抓取一帧,返回的IplImage*不可手动释放!
------------------------------------------------------*/
virtual void * QueryFrame();
/*-----------------------------------------------------
开始录制视频
path: 指定视频保存的路径,默认为“out.avi”
fps: 指定录制视频的帧率,-1表示使用视频格式默认的帧率,YUY2为8,MJPEG为25;
------------------------------------------------------*/
virtual void StartRecord(const char *path = "out.avi", int fps = -1);
/*-----------------------------------------------------
停止录制
------------------------------------------------------*/
virtual void StopRecord();
/*-----------------------------------------------------
获取当前帧率
------------------------------------------------------*/
virtual double GetFps(){ return Fps; }
/*-----------------------------------------------------
重置fps的计算,用于帧率受影响后从新计算帧率
------------------------------------------------------*/
virtual void ResetFps();
本文相关【Demo】