videoInput视频采集
videoInput github地址
从中获取到videoInput.cpp和videoInput.h两个文件。
创建vs工程加入上面两个文件并创建main.cpp。main.cpp中调用videoInput的api进行摄像头的设置,开启,采集。示例代码:
#include <iostream>
#include <thread>
#include <time.h>
#include "videoInput.h"
using namespace std;
int main()
{
//获取摄像头的数量和名字
videoInput vi;
int deviceNum = vi.listDevices();
cout << "device total num=" << deviceNum << endl;
for (int i = 0; i < deviceNum; i++) {
cout << "DeviceName:" << vi.getDeviceName(i) << endl;
}
//开启摄像头,设置帧率、宽、高
int deviceId = 0;
vi.setIdealFramerate(deviceId, 30);
if (!vi.setupDevice(deviceId, 1280, 720)) {
cout << "setupDevice failed" << endl;
return -1;
}
//判断摄像头是否开启
if (!vi.isDeviceSetup(deviceId)) {
cout << "setupDevice failed" << endl;
return -1;
}
cout << "get device successed:" << vi.getDeviceName(deviceId) << endl;
//获取摄像头支持的宽高,创建获取图像的缓存
int index = 0;
int width = vi.getWidth(deviceId);
int height = vi.getHeight(deviceId);
int size = vi.getSize(deviceId);
uint8_t* rgb = new uint8_t[size];
clock_t start, finish;
while (true) {
//判断当前是否有新的采集图像
if (vi.isFrameNew(deviceId)) {
start = clock();
//获取采集的图像数据
if (vi.getPixels(deviceId, rgb, true, true)) {
finish = clock();
cout << "get rgb data successed index=" << ++index << " duration=" << finish - start << endl;
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(20));
}
vi.stopDevice(deviceId);
delete[] rgb;
rgb = nullptr;
return 0;
}
注意事项:
1.在设置分辨率为1280*720的时候发现采集帧率很低,大约10fps。与设置的30fps相差很多,经排查将videoInput.cpp的setSizeAndSubtype方法中以下代码进行注释,帧率变快很多。
//VD->pAmMediaType->formattype = FORMAT_VideoInfo;
//VD->pAmMediaType->majortype = MEDIATYPE_Video;
//VD->pAmMediaType->subtype = mediatype;
如果设置以上属性,获取新帧的回调会很久触发一次,猜测是进行了图像的格式转换,导致耗时较长。