用OpenCV2 打开多摄像头,如何确定摄像头序号

这是个小问题。
按照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;
}