Linux通过vidpid找到摄像头对应的索引

8 篇文章 0 订阅
3 篇文章 0 订阅

准备条件

  1. 安装udev: sudo apt-get install libudev-dev
  2. 项目引入头文件:#include <libudev.h>
  3. 项目添加: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);
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,下面是Unity中通过对象池选择对应索引的角色的实现方法: 1. 创建一个角色对象池 首先,您需要创建一个角色对象池,用于管理和重复利用角色对象。您可以使用List或Dictionary等数据结构来实现对象池。在对象池中,每个角色对象都应该有一个唯一的标识符,例如名称或ID。 2. 预加载角色对象 在游戏开始时,您可以预加载一些角色对象到对象池中,以便后续使用。您可以根据需要预加载所有角色,或者只预加载一部分角色。例如,您可以预加载前三个角色,而其他角色则在需要时再加载。 3. 选择对应索引的角色 当需要选择对应索引的角色时,您可以使用索引来获取对象池中的角色对象。例如,如果您使用List来实现对象池,可以使用以下代码获取对应索引的角色对象: ``` public List<GameObject> characterPool; // 角色对象池 public GameObject GetCharacterByIndex(int index) { if(index < 0 || index >= characterPool.Count) { Debug.LogError("Invalid index"); return null; } return characterPool[index]; } ``` 在这个例子中,我们定义了一个characterPool列表来存储角色对象。GetCharacterByIndex函数接受一个整数参数index,用于指定要获取的角色的索引。如果索引无效,则返回null。否则,返回对应索引的角色对象。 4. 对象池中的对象重复使用 为了避免在游戏中频繁创建和销毁对象,您可以在对象池中重复使用对象。例如,当一个角色对象不再需要时,您可以将其设置为非活动状态,并将其返回到对象池中。下次需要一个角色对象时,您可以从对象池中取出一个已经存在的对象,并将其设置为活动状态。 如果对象池中没有可用的对象,则可以根据需要创建一个新的对象,并将其添加到对象池中。当对象池中的对象数量达到一定数量时,您可以考虑销毁一些不再需要的对象以节省内存。 综上所述,通过对象池选择对应索引的角色可以提高游戏的性能和内存管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值