Directshow & Opencv进行UVC开发

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】

你可能感兴趣的:(OpenCV)