Discovery:在vs2013平台上应用VideoInput第三方库

应用VideoInput视频信息采集库的记录

硬件平台:window10 i7、usb外接摄像头
软件平台:visual studio ultimata 2013、opencv 2.4.9、videoinput库

  1. 问题描述

    项目涉及到usb摄像头视频信息的采集,开始直接尝试了opencv中的VideoCapture类作为工具,发现其有不如人意之处,比如读入视频慢,有可能会崩溃还有该死的摄像头ID(即:int device)莫名其妙。

  2. 网页搜索过程

    首先发现VideoInput库功能强大;
    接着发现opencv2.x已经在highgui_c.h中已经含有VideoInput的函数功能,但其说明文档并未提及,尝试直接从其中刨出这个类,但涉及到cvCreateCameraCapture(CV_CAP_DSHOW)这个函数,莫名没力气(原创传送门入口);
    最后找到了github上videoInput原作者的代码(链接入口)。

  3. 操作过程

    直接在工程中包含了上面代码的其中两个文件VideoInput.cpp和VideoInput.h;这两个文件在vs平台下有两个问题:1、存在一处const类型转换问题,在左边加上const类型名即可;2、安全函数报警问题:在报警文件头加上#pragma warning(disable:4996)即可;

下面提供部分类函数解释:

VideoInput类,相关的类是VideoDevice setVerbose:控制是否在控制台输出信息开关
listDevices:打印出可用视频设备文字信息,其返回值为可用的设备数(0,1,2,…) getDeviceName:得到设备名函数
setUseCallback:视频捕捉的回调函数设置函数
setIdealFramerate:调整捕捉帧率的函数(默认30fps,可修改,但不能被保证准确,directshow会尝试一个邻近的帧率)
setAutoReconnectOnFreeze:防止设备休眠重新连接的函数 setupDevice:开启设备函数
setFormat:设置视频制式 isFrameNew:检测是否有新的帧函数 isDeviceSetup:检测视频是否开启
getPixels:获得数据的函数(注意这里获得的数据时uchar型的指针) showSettingsWindow:显示视频设置窗口函数
控制视频设置的相关函数有setVideoSettingFilter、setVideoSettingFilterPct、getVideoSettingFilter、
setVideoSettingCamera、setVideoSettingCameraPct、getVideoSettingCamera
获得视频宽高信息的函数有getWidth、getHeight、getSize stopDevice:停止设备函数
restartDevice:重启设备函数

最后提供一个小demo:

#include "videoInput.h"
int main()
{
    videoInput camera;
    int DevicesNum = camera.listDevices(); //可用设备数并在输出窗口打印相关信息
    string DeviceName[5];
    for (int i = 0; i < DevicesNum; i++)
    {
        string tmp(camera.getDeviceName(i));
        DeviceName[i] = tmp;
    }
    int devID = 1; // 范围:0 ~ numDevices - 1 选择设备
    cout << "你选择的usb设备名:" << DeviceName [devID] << endl;
    camera.setupDevice(devID, 680, 480);// 开启相关设备
    if(!camera.isDeviceSetup(devID))
        return -1;
    int width = camera.getWidth(devID);
    int height = camera.getHeight(devID);
    int imgSize = camera.getSize(devID);
    unsigned char* dataBuffer = new unsigned char[imgSize];
    while (true)
    {
        // 摄像头数据更新情况下,获取一帧图象,on opencv(BGR & flip)
        if (camera.isFrameNew(devID))
        {
            camera.getPixels(devID, dataBuffer, false, true);
        }
        Mat imgData = Mat(height, width, CV_8UC3, dataBuffer);  // 待读入图象 
        imshow("preview", imgData);
        if (waitKey(30) >= 0)
            break;
    }
    camera.stopDevice(devID);
    return 0;
}

效果图如下:
Discovery:在vs2013平台上应用VideoInput第三方库_第1张图片

以上


你可能感兴趣的:(Mess)