准备条件
- 安装udev: sudo apt-get install libudev-dev
- 项目引入头文件:#include <libudev.h>
- 项目添加:cmake添加udev库 libudev.so
代码实现
//get vidpid->index
int GetCameraId(int &id,std::string vid,std::string pid)
{
struct udev *udev = NULL;
struct udev_enumerate *udev_enumerate = NULL;
struct udev_list_entry *list_entry = NULL;
int count = 0;
udev = udev_new();
if (udev == NULL)
{
loge("udev null");
return -1;
}
udev_enumerate = udev_enumerate_new(udev);
if(udev_enumerate == NULL)
{
loge("udev_enumerate null");
udev_unref(udev);
return -1;
}
udev_enumerate_add_match_subsystem(udev_enumerate, "video4linux");
udev_enumerate_scan_devices(udev_enumerate);
udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(udev_enumerate))
{
struct udev_device *device = NULL;
device = udev_device_new_from_syspath(udev_enumerate_get_udev(udev_enumerate),
udev_list_entry_get_name(list_entry));
const char* buff=udev_device_get_property_value(device, "ID_MODEL_ID");
if(device != NULL)
{
if((udev_device_get_property_value(device, "ID_VENDOR_ID") != NULL) &&
(udev_device_get_property_value(device, "ID_MODEL_ID") != NULL) &&
(vid == std::string(udev_device_get_property_value(device, "ID_VENDOR_ID"))) &&
(pid == std::string(udev_device_get_property_value(device, "ID_MODEL_ID"))))
{
//LOG(sw_MS, "device: '%s' (%s) (/dev/video%s) %s:%s\n",
//udev_device_get_syspath(device),
//udev_device_get_subsystem(device),
//udev_device_get_sysnum(device),
//udev_device_get_property_value(device, "ID_VENDOR_ID"), // 查询设备信息 udevadm info --query=all --name=/dev/video0
//udev_device_get_property_value(device, "ID_MODEL_ID"));
//sprintf(PathName, "/dev/video%s", udev_device_get_sysnum(device));
id = atoi(udev_device_get_sysnum(device));
count++;
logd("canemra id:{},count:{}",id,count);
break;
}
udev_device_unref(device);
}
else
{
loge(" device null!!");
udev_enumerate_unref(udev_enumerate);
udev_unref(udev);
return -1;
}
}
if(count == 0)
{
loge(" device count error!!");
udev_enumerate_unref(udev_enumerate);
udev_unref(udev);
return -2;
}
udev_enumerate_unref(udev_enumerate);
udev_unref(udev);
return 0;
}
opencv打开摄像头
** 根据vidpid获取到的索引打开摄像头**
cv::VideoCapture rgb_cap;
cv::VideoCapture ir_cap;
std::string rgb_strIndex="/dev/video"+std::to_string(g.rgb_index);
logi("rgb path:{}",rgb_strIndex);
std::string ir_strIndex="/dev/video"+std::to_string(g.ir_index);
logi("ir path:{}",ir_strIndex);
//rgb
rgb_cap.open(rgb_strIndex);