当前位置:   article > 正文

通过Opencv打开指定摄像头的方法_opencv打开摄像头

opencv打开摄像头

我们使用Opencv打开摄像头,一般是使用VideoCapture的open接口。

CV_WRAP virtual bool open(int index);

open接口要传入一个标识符,如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。

系统:

银河麒麟linux系统

问题:

现在我插入了一个双目摄像头(两个USB线,一个彩色,一个红外),那我就想打开彩色的,怎么办呢?每次我插入USB线,系统都会默认给设备分配一个video路径,例如 /dev/video3,根据插入USB线的顺序,每次分配的都不一样,这样通过open就不能指定打开哪一个。

解决思路:

每个设备都有自己的pid和vid,我要通过pid和vid找到特定的/dev/video,例如我获取到了路径 /dev/video3,那么取最后的数字3,通过open(3),即可打开指定的摄像头。需要使用libudev。

下面的函数是通过遍历所有的视频设备,再用摄像头的pid和vid与其对比,最后得到摄像头的路径。(这里注意麒麟linux和UOS系统,打开的序号可能会相差1,所以UOS系统需要可能要再-1)

  1. int findCameraVideoPath(char *pid, char *vid, char *dpath)
  2. {
  3. struct udev *udev = NULL;
  4. struct udev_enumerate *udev_enumerate = NULL;
  5. struct udev_list_entry *list_entry = NULL;
  6. int count = 0;
  7. int flag = 0;
  8. char devName[128]={0};
  9. udev = udev_new();
  10. if(udev == NULL)
  11. {
  12. //tips
  13. return 0;
  14. }
  15. udev_enumerate = udev_enumerate_new(udev);
  16. if(udev_enumerate == NULL)
  17. {
  18. //tips
  19. return 0;
  20. }
  21. udev_enumerate_add_match_subsystem(udev_enumerate, "video4linux");
  22. udev_enumerate_scan_devices(udev_enumerate);
  23. udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(udev_enumerate))
  24. {
  25. struct udev_device *device;
  26. device = udev_device_new_from_syspath(udev_enumerate_get_udev(udev_enumerate), udev_list_entry_get_name(list_entry));
  27. if(device!=NULL)
  28. {
  29. //tips
  30. );
  31. if(udev_device_get_property_value(device, "ID_VENDOR_ID")!=NULL &&
  32. udev_device_get_property_value(device, "ID_MODEL_ID")!=NULL &&
  33. !strcmp(vid, udev_device_get_property_value(device, "ID_VENDOR_ID")) &&
  34. !strcmp(pid, udev_device_get_property_value(device, "ID_MODEL_ID")))
  35. {
  36. sprintf(devName,"/dev/video%s", udev_device_get_sysnum(device));
  37. flag = 1;
  38. count++;
  39. }
  40. udev_device_unref(device);
  41. }
  42. else
  43. {
  44. //tips
  45. }
  46. }
  47. if(flag!=0)
  48. {
  49. if(strlen(devName)>0)
  50. memcpy(dpath, devName, strlen(devName));
  51. }
  52. udev_enumerate_unref(udev_enumerate);
  53. udev_unref(udev);
  54. return flag;
  55. }

下面附上win系统MFC的事例,与上面思路类似:

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <DShow.h>
  5. #include <CString>
  6. #pragma comment(lib,"Strmiids.lib")
  7. using namespace std;
  8. //输入:pidvid exp: vid_1234&pid_1234
  9. //输出:ID, 为-1则找不到设备
  10. int getCamIDFromPidVid(char* pidvid)
  11. {
  12. int iRet = -1;
  13. int iCameraNum = 0; //设备个数
  14. vector<CString> devList; //设备列表
  15. CString str ;
  16. ICreateDevEnum *pDevEnum = NULL;
  17. IEnumMoniker *pEnum = NULL;
  18. HRESULT hr = NULL;
  19. CoInitialize(NULL);
  20. hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,reinterpret_cast<void**>(&pDevEnum));
  21. if (SUCCEEDED(hr))
  22. {
  23. hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnum,0);
  24. if (hr == S_OK)
  25. {
  26. //枚举捕获设备
  27. IMoniker *pMoniker = NULL;
  28. ULONG cFetched;
  29. while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK)
  30. {
  31. IPropertyBag* pPropBag;
  32. hr = pMoniker->BindToStorage(0,0,IID_IPropertyBag,reinterpret_cast<void**>(&pPropBag));
  33. if (SUCCEEDED(hr))
  34. {
  35. //获取设备路径,路径里包含pidvid的信息
  36. VARIANT varName;
  37. varName.vt = VT_BSTR;
  38. VariantInit(&varName);
  39. hr = pPropBag->Read(L"DevicePath", &varName, 0); //read函数只能够读取CLSID, FriendlyName, DevicePath这三种
  40. CString sdev(varName);
  41. devList.push_back(sdev);
  42. iCameraNum ++;
  43. pPropBag->Release();
  44. }
  45. pMoniker->Release();
  46. }
  47. }
  48. }
  49. //对比,得到id
  50. for(int i = 0;i<devList.size();i++)
  51. {
  52. int index = devList[i].Find(pidvid);
  53. if(index != -1)
  54. {
  55. iRet = i;
  56. break;
  57. }
  58. }
  59. CoUninitialize();
  60. return iRet;
  61. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/819662
推荐阅读
相关标签
  

闽ICP备14008679号