这是个小问题。
按照OpenCV说明书的说法,打开摄像头,可以使用如下语句形式:
VideoCapture::VideoCapture(int device)
对于其中的device部分,说明手册有如下提示
device – id of the opened video capturing device (i.e. a camera index).
我想问的是,使用多个摄像头时,如何确定各个摄像头所对应的id。
比如,当有两个摄像头时,我尝试一个为0,一个为1,通过看捕获的图像,可以确定各摄像头的id,但不知这个顺序是否固定。但这样毕竟很被动,而且不知道开关机等操作后,再运行改程序,设备号是否会变化。
我想一定有可以查看摄像头对应的所谓id的方法,但没有搜到,希望有人能解答。
这个估计得看看源码是怎么样操作的,官方文档里面也就是你说的那些,没有提到更多的细节
我找到解决方案了:
你看看这连篇文章:
http://wiki.ros.org/robotino_cam/Tutorials/Using%20multiple%20cameras
http://unix.stackexchange.com/questions/77170/how-to-bind-v4l2-usb-cameras-to-the-same-device-names-even-after-reboot
这几天也碰到这个问题,查找了很久,好像Opencv里没有直接的办法。如果是windowos平台的话,网上不少提到利用windows的系统函数来获取,
我在QT上试了一下没成功,时间关系没再试了。
有一个“笨办法”:先用QT的QCamera,QCameraInfo 获取可用摄像头的数量和名称。有了数量后,Opencv操作摄像头需要的 Index,可以通过逐个摄像头切换(0->N),显示视频,人工来确定对应关系。
可以做一个自动扫描的按钮,当检测到摄像头数量或名称有变化时,手动扫描确认一次。
//提供一个思路,以下函数是根据摄像头索引号读取友好名称,判断友好名称是否跟你要调用的摄像头同名,就能确定这个索引号
int CameraName(int nCamID, char* sName, int nBufferSize)
{
int count = 0;
CoInitialize(NULL);
// enumerate all video capture devices
CComPtr<ICreateDevEnum> pCreateDevEnum;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);
CComPtr<IEnumMoniker> pEm;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&pEm, 0);
if (hr != NOERROR) return 0;
pEm->Reset();
ULONG cFetched;
IMoniker *pM;
while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
{
if (count == nCamID)
{
IPropertyBag *pBag=0;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL); //还有其他属性,像描述信息等等...
if(hr == NOERROR)
{
//获取设备名称
WideCharToMultiByte(CP_ACP,0,var.bstrVal,-1,sName, nBufferSize ,"",NULL);
SysFreeString(var.bstrVal);
}
pBag->Release();
}
pM->Release();
break;
}
count++;
}
pCreateDevEnum = NULL;
pEm = NULL;
return 1;
}