最近做一个东西,摄像头使用的高清摄像头,采集出来的视频是D1格式(720*480)。使用VideoCapture发现速度很忙,网上的朋友说VideoCapture提供的读写功能采用VFW,效率低下且有些格式支持不好。而 可以看,开源伟大。
网上见过其他朋友写过2.2实现VideoInput的使用,我实验发现2.3中的使用方法基本没有变化。后面再把配套例程奉上,先把VideoInput类内的公有成员函数一一介绍一下,该类还有个相关的类是VideoDevice。包括控制是否在控制台输出信息开关setVerbose函数,打印出可用视频设备信息的函数listDevices,之后可以得到设备名函数getDeviceName,视频捕捉的回调函数设置函数setUseCallback,调整捕捉帧率的函数setIdealFramerate(默认30fps,可修改,但不能被保证准确,directshow会尝试一个邻近的帧率),防止设备休眠重新连接的函数setAutoReconnectOnFreeze,开启设备函数setupDevice,在setpuDevice之前可以设置视频制式,调用函数为setFormat,检测是否有新的帧函数isFrameNew,检测视频是否开启isDeviceSetup,获得数据的函数getPixels(注意这里获得的数据时uchar型的指针),显示视频设置窗口函数showSettingsWindow,控制视频设置的相关函数有setVideoSettingFilter、setVideoSettingFilterPct、getVideoSettingFilter、setVideoSettingCamera、setVideoSettingCameraPct、getVideoSettingCamera,获得视频宽高信息的函数有getWidth、getHeight、getSize,停止设备函数stopDevice,重启设备函数restartDevice。
讲了这么多函数,还是直接上代码说话吧,我这是找的VideoInput注释中的一个例程。
- // 创建一个videoInput对象
- videoInput VI;
- // 输出设备列表并返回发现的设备数量
- int numDevices = VI.listDevices();
- int device1 = 0; // 这可能是在listDevices中显示的任何deviceID
- int device2 = 1; // 这可能是在listDevices中显示的任何deviceID
- // 如果要以不同的帧速率捕获(默认为30)
- // 在这里指定,你不能保证得到这个fps。
- // VI.setIdealFramerate(dev, 60);
- // 设置第一个设备 - 有很多选项:
- VI.setupDevice(device1); // 使用默认设置设置第一个设备
- //VI.setupDevice(device1, VI_COMPOSITE); //