应用VideoInput视频信息采集库的记录
硬件平台:window10 i7、usb外接摄像头
软件平台:visual studio ultimata 2013、opencv 2.4.9、videoinput库
问题描述
项目涉及到usb摄像头视频信息的采集,开始直接尝试了opencv中的VideoCapture类作为工具,发现其有不如人意之处,比如读入视频慢,有可能会崩溃还有该死的摄像头ID(即:int device)莫名其妙。
网页搜索过程
首先发现VideoInput库功能强大;
接着发现opencv2.x已经在highgui_c.h中已经含有VideoInput的函数功能,但其说明文档并未提及,尝试直接从其中刨出这个类,但涉及到cvCreateCameraCapture(CV_CAP_DSHOW)这个函数,莫名没力气(原创传送门入口);
最后找到了github上videoInput原作者的代码(链接入口)。操作过程
直接在工程中包含了上面代码的其中两个文件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;
}
效果图如下:
以上