Linux系统下自动搜索USB摄像头地址及设备信息

在进行到多个USB摄像头开发时,会涉及到获取摄像头地址及设备信息问题。

一般USB摄像头的设备信息是固定的,我们基于设备信息,就可以在软件开发时进行有选择性地使用特定摄像头。

整个代码测试环境:Ubuntu18.04,使用Cmake编译

完整的工程代码:https://github.com/chunqiangqian/ScanCamera

搜索USB摄像头的主程序:

#include "scane.h"int v4l2_open(const char* name, int flag)
{int fd = open(name, flag);if(fd < 0){printf("ERR(%s):failed to open %s\n", __func__, name);return -1;}return fd;
}int v4l2_close(int fd)
{if(close(fd)){printf("ERR(%s):failed to close v4l2 dev\n", __func__);return -1;}return 0;
}int v4l2_querycap(int fd, struct v4l2_capability* cap)
{if (ioctl(fd, VIDIOC_QUERYCAP, cap) < 0){printf("ERR(%s):VIDIOC_QUERYCAP failed\n", __func__);return -1;}return 0;
}int v4l2_enuminput(int fd, int index, char* name)
{struct v4l2_input input;int found = 0;input.index = 0;while(!ioctl(fd, VIDIOC_ENUMINPUT, &input)){//printf("input:%s\n", input.name);if(input.index == index){found = 1;strcpy(name, (char*)input.name);}++input.index;}if(!found){//printf("%s:can't find input dev\n", __func__);return -1;}return 0;
}int usb_camera_open(const char *dev, v4l2_buf** mV4l2Buf, std::string &card)
{int cameraFd = v4l2_open(dev, O_RDWR);if(cameraFd < 0){printf("open %s failed\r\n", dev);return -1;}// get camera infostruct v4l2_capability cap;int ret = v4l2_querycap(cameraFd, &cap);if(ret < 0){printf("set v4l2_querycap failed\r\n");return -1;}else{//std::cout << "card: " << cap.card << '\n';//std::cout << "driver: " << cap.driver << '\n';//std::cout << "bus info: " << cap.bus_info << '\n';//std::cout << "device cap: " << cap.device_caps << '\n';card = (char*)(cap.card);}if(!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)){printf("capabilities failed\r\n");return -1;}char devName[100];ret = v4l2_enuminput(cameraFd, 0, devName);if(ret < 0){//printf("v4l2_enuminput failed\r\n");return -1;}return cameraFd;}void ScaneCameras()
{struct v4l2_buf* mV4l2Buf;std::string card;struct dirent *ent;char path_[] = "/dev";DIR *dir = opendir(path_);if (dir != NULL) {while ((ent = readdir(dir)) != NULL){// 截取部分char,这里只截取前5个char filename[5];strncpy(filename, ent->d_name, 5);// 字符串比较,并获取完整的摄像头路径if (strcmp(filename, "video") == 0) {//printf("%s\n", ent->d_name);std::string camPath;camPath.append("/dev/");camPath.append(ent->d_name);int cameraDevFd = usb_camera_open(camPath.c_str(), &mV4l2Buf, card);if (cameraDevFd > 0) {// 摄像头路径printf("%s\n", ent->d_name);// 摄像头信息std::cout << "card: " << card << '\n';//std::cout << "cameraDevFd: " << cameraDevFd << '\n';}}}closedir(dir);} else{perror("opendir error");}}

Linux系统下自动搜索USB摄像头地址及设备信息相关推荐

  1. linux下挂载优盘脚本,一种linux系统下自动挂载U盘的方法与流程

    技术领域 本发明涉及服务器维护技术领域,尤其涉及一种linux系统下自动挂载U盘的方法. 背景技术: 不管是测试服务器的维护,还是用户使用的服务器,在维护.更新.使用过程中,需要使用U盘向服务器拷贝文 ...

  2. linux系统下,浏览器怎么调用本地硬件设备如指纹仪等。

    linux系统下,浏览器怎么调用本地硬件设备如指纹仪等. 这个问题是一个同学在项目开发中遇到的问题,做的也是政府部门相关的项目,由于现在政府部门都在慢慢开始放弃windows系统改用Linux系统了, ...

  3. Windows,Android设备刷机(重装系统)时遇到USB读取不到设备信息(设备驱动异常)问题及解决办法

    Windows,Android设备刷机(重装系统)时遇到USB读取不到设备信息(设备驱动异常)问题及解决办法 前言 当刷Android系统时,我们要进入boot模式,**adb reboot boot ...

  4. linux写语句自动执行一次,Linux系统下自动执行指定任务 cron

    cron来源于希腊单词chronos(意为"时间"),是linux系统下一个自动执行指定任务的程序.例如,你想在每晚睡觉期间创建某些文件或文件夹的备份,就可以用cron来自动执行. ...

  5. linux c 获取mac地址吗,Linux系统下用C语言获取MAC地址

    最近在做一个小程序,需要用到在linux系统里编写C程序从而获取MAC地址,从网上搜了一遍,想总结一下.如果你就只需要单个功能的程序,可以采用方法一,见代码1,一般最好能够封装起来,写成获取MAC地址 ...

  6. Linux系统下,绑定USB串口设备号,解决上电USBID随机情况

    linux树莓派下绑定USB口,固定USB串口设备号,解决USB转串口ID相同情况 摘要:在树莓派USB口,虽然设备会变,但是位置不变,每个位置都有个KERNELS号,因此可以通过绑定这个位置的ID. ...

  7. linux界面添加地址,Linux系统下图形界面更改IP地址

    1.打开终端的命令模式: 点击左上角的application 然后点击System Tools下拉菜单,再点击其展开的下拉菜单Terminal,这样就打开一个命令模式了. 2.查找所要使用的命令模块的 ...

  8. linux乌邦图更改ip,Linux系统下图形界面更改IP地址分享

    1.打开终端的命令模式: 点击左上角的application 然后点击System Tools下拉菜单,再点击其展开的下拉菜单Terminal,这样就打开一个命令模式了. 2.查找所要使用的命令模块的 ...

  9. 红帽子linux改ip命令,Linux系统下图形界面更改IP地址

    1.打开终端的命令模式: 点击左上角的application 然后点击System Tools下拉菜单,再点击其展开的下拉菜单Terminal,这样就打开一个命令模式了. 2.查找所要使用的命令模块的 ...

最新文章

  1. TCP/IP协议三次握手与四次握手流程解析
  2. 程序员毕业两年,三年工作经验是怎么来的? | 每日趣闻
  3. 可由一个尾指针唯一确定的链表有_L2数据结构第08课 单向链表和循环链表
  4. mysql中主从_MySQL的主从
  5. 动态规划 dp03 最长公共子串问题 c代码
  6. java jstack 死锁_利用jstack检测死锁DeadLock
  7. 巧用windows xp远程桌面web连接
  8. python写程序注意事项(很重要)
  9. 计算机网络要点,计算机网络要点
  10. 中国一二三四线城市最新划分
  11. 平面设计师需要掌握哪些印刷知识
  12. (十三)Thread-Specific Storage(ThreadLocal)模式
  13. C#中的控件Binding
  14. 怎样校验MD5码及sha1码数值(适用于Windows及Linux平台)
  15. el-form 表单的校验
  16. JVM笔记-性能监控与分析工具
  17. 从2-3树到 红黑树
  18. Unity最详细的动画总结包含IK反向动力学,AvatarMask骨骼遮罩,模型导入错误解决,MatchTarget
  19. 生产环境系统突然访问速度变慢问题排查
  20. 经典力学(动力学)——动量守恒定律与能量守恒定律

热门文章

  1. 搜索引擎最新算法大全|更新到2020.2.28日(百度算法大全、360算法大全)
  2. Python连接MySQL数据库部分问题阐述Connection to @localhost failed. [08001] Could not create connection to databa
  3. 并不是只有 Redis 才可以做缓存
  4. 拍拍贷业务数据探索分析-基于R语言
  5. 分手了还能做朋友吗?(2012年2月22日)
  6. 安全篇 ━━ 整改php和IIS(根据安全等级保护评估、渗透测试报告)
  7. wap商城源码php,ecshop商城源码html5手机wap响应式自适应php网站模板带后端dossy
  8. CSDN积分获取方法(转载)
  9. pic16f616单片机C语言编程,PIC16F616单片机学习经验总结
  10. eclipse反编译离线安装