情况: 需要跑ORBSLAM, 之前一直使用USB接口的相机, 打开摄像头一般使用的是ROS下的usb-cam-node进行驱动,采集图像并发布成topic的形式,或者使用opencv的videoCapture进行图像的捕捉;

因为某些原因需要将usb接口的camera转换成mipi接口的相机; 还是使用了原先usb_cam_node进行摄像头的驱动,输入/dev/video, 对应的width和height之后,结果出现了如下的提示:

最主要的就是[ERROR], 提示如下:

[ERROR] [1608815170.494006746]: /dev/video4 is no video capture device capability is 2216693760

在usb_cam_node中找到对应的代码如下:

  if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)){ROS_ERROR_STREAM(camera_dev_ << " is no video capture device capability is " <<cap.capabilities );exit(EXIT_FAILURE);}

这里的cap是v4l2_capability类型的变量,

struct v4l2_capability
{u8 driver[16]; // 驱动名字u8 card[32]; // 设备名字u8 bus_info[32]; // 设备在系统中的位置u32 version; // 驱动版本号u32 capabilities; // 设备支持的操作u32 reserved[4]; // 保留字段
};

将2216693760转换成十六进制即为: 0x84201000, 对应到v4l2_capability所表示的devide的所支持的操作分别是:

V4L2_CAP_DEVICE_CAPS
V4L2_CAP_STREAMING
V4L2_CAP_EXT_PIX_FORMAT
V4L2_CAP_VIDEO_CAPTURE_MPLANE

其中,最后一项操作的解释如下:

/* Is a video capture device that supports multiplanar formats */
#define V4L2_CAP_VIDEO_CAPTURE_MPLANE   0x00001000

而对应到usb_cam.cpp中报错部分的代码, 需要的是支持下面两种操作的设备:

V4L2_CAP_VIDEO_CAPTURE
V4L2_CAP_STREAMING

接下来对V4L2一个简单的总结:
Video for Linuxtwo(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。

在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文件是/dev/video0。V4L2支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。V4L2在include/linux/videodev.h文件中定义了一些重要的数据结构,在采集图像的过程中,就是通过对这些数据的操作来获得最终的图像数据。Linux系统V4L2的能力可在Linux内核编译阶段配置,默认情况下都有此开发接口。

应用程序通过V4L2进行视频采集的原理

V4L2支持内存映射方式(mmap)和直接读取方式(read)来采集数据,前者一般用于连续视频数据的采集,后者常用于静态图片数据的采集,本文重点讨论内存映射方式的视频采集。

应用程序通过V4L2接口采集视频数据分为五个步骤:

首先,打开视频设备文件,进行视频采集的参数初始化,通过V4L2接口设置视频图像的采集窗口、采集的点阵大小和格式;

其次,申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;

第三,将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;

第四,驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理完后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据;

第五,停止视频采集。

具体的程序实现流程可以参考下面的流程图:

关于usb接口的相机和MIPI接口的相机之间还有一个需要注意的区别是如下的类型:

/*   Stream type-dependent parameters*/
struct v4l2_streamparm {__u32    type;          /* enum v4l2_buf_type */union {struct v4l2_captureparm  capture;struct v4l2_outputparm  output;__u8 raw_data[200];  /* user-defined */} parm;
};

结构体包含两个结构体, 但是需要注意的v4l2_captureparm只能用于CAPTURE type, 而mipi接口的摄像头是不具有这种操作性的,即capability中没有这项

其对应的相关调用如下:

函数:ioctl(fd,VIDIOC_G_PARM,struct v4l2_streamparm *argp);  //VIDIOC_S_PARM作用:流相关 (如帧率)

如有疑问,欢迎交流: wx: baobaohaha_ 欢迎对SLAM有兴趣的小伙伴一起交流学习~~

参考:

V4L2对应的函数和变量详解

V4L2和MIPI接口的简要说明

V4L2学习流程分析

V4L2基础编程

V4L2官网讲解 英文

V4L2下摄像头的详细参数调整

mipi接口的摄像头驱动并发布话题相关推荐

  1. rp3399之mipi接口ov4689摄像头驱动

    linux的驱动程序移植的精髓在于移植而不是编写,移植不代表简单了. 驱动程序包一般有几个或者几十个文件,另外有设备树进行配置资源,一个驱动的整个框架构成.加载过程.调试方法的掌握很关键了. 进入正题 ...

  2. 三星 摄像头 linux,基于Linux 3.0.8 Samsung FIMC(S5PV210) 的摄像头驱动框架解读(一)...

    FIMC这个名字应该是从S5PC1x0开始出现的,在s5pv210里面的定义是摄像头接口,但是它同样具有图像数据颜色空间转换的作用.而exynos4412对它的定义看起来更清晰些,摄像头接口被定义为F ...

  3. linux的DRM之mipi应用程序,LCD之MIPI接口

    LCD之MIPI接口 (因本人之局限性,内容仅供参考.错误之处,敬请指出.谢谢!)linux 说到mipi接口,它不仅是一个简简单单的一个接口.而是一个两层概念的叠加:物理传输系统结构(物理层面) 和 ...

  4. linux mipi摄像头驱动,VS-RK3399 在linux系统下面调试Mipi camera接口介绍

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 debian系统目前支持Usb camera是没有问题,走UVC功能接口.那么mipi 接口camera和并口接口的camera,在Debian系统怎么设 ...

  5. 学习笔记(一)-古月ROS机器视觉开发入门 -ROS摄像头驱动及数据接口

    ROS摄像头驱动及数据接口 二维摄像头 我们平常用的最多的就是二维摄像头,大部分笔记本上都会自带一个2d的摄像头,这种摄像头的接口一般是USB接口,市面上看到的罗技摄像头.RGB摄像头等,它们的底层协 ...

  6. mipi接口 1280(RGB)*720 LCD屏开发驱动笔记帖

    ps:创业开发产品,自学笔记,不一定适合教材性的阅读,零碎整理,自我总结用 材料:4.1寸lcd屏两块,屏自带触控,屏幕资料具备,rk3399和MK8788开发版上分别开发. 开发环境: 1]rk33 ...

  7. 常见摄像头接口USB、DVP、MIPI接口的对比

    常见摄像头接口DVP.MIPI.USB的比较 引言 摄像头传感器已经广泛用于嵌入式设备了,现在的手机很多都支持多个摄像头. 在物联网领域,摄像头传感器也越来越被广泛使用.今天就来简单聊一聊几种常见的摄 ...

  8. 摄像头的MIPI接口、DVP接口和CSI接口听语音 zhuanzai

    摄像头的MIPI接口.DVP接口和CSI接口听语音 在现实生活中,摄像头随处可见,但是对于一个电子工程师来讲,理解摄像头的使用方法还是非常有必要的,一般来讲,摄像头的接口主要有MIPI接口.DVP接口 ...

  9. 古月居ROS机器视觉开发——ROS摄像头驱动及数据接口(一)

    ROS机器视觉 文章目录 ROS机器视觉 一.摄像头分类 二.ROS驱动摄像头 1.安装功能包 2.参数设置 3.功能包详解 总结 古月居,想具体了解的可以去看古月居的课程,我只是简单的记录一下笔记. ...

最新文章

  1. 更改管理GPO的域控制器
  2. 刻意练习:Python基础 -- Task12. 模块
  3. 构建根文件系统之busybox(一)浅析
  4. 程序员面试题精选100题(18)-用两个栈实现队列[数据结构]
  5. Python接口测试-模块引用与映射
  6. [USACO1.2]回文平方数 Palindromic Squares
  7. 5.10 阻尼倒数法
  8. python蟒蛇实例
  9. IOS 蓝牙开发(六)蓝牙手柄 GameController开发
  10. 超详细 excel 基础知识
  11. 航班延误来领钱,信用卡航班延误险最全攻略(2018年版)
  12. 微信小程序创建直播间流程
  13. Calendar(日历)
  14. LVM挂盘(centos7 使用parted命令分区挂盘操作详细)
  15. centos7搭建GRE隧道进行通信
  16. 网闸虚拟服务器,tcp客户端和tcp服务器端 网闸
  17. ICC Profile
  18. access找不到输入表或者dual_神奇的DUAL表总结
  19. ublox_f9p 代码中接入别人编译好的连接库(PPP定位)
  20. 带你搞明白单侧双侧T检验

热门文章

  1. 数据结构实验报告(二)简单计算器(中缀转后缀)
  2. 图片不存在时,显示默认图片
  3. Yoink for mac(临时文件拖放暂存工具)
  4. Android 开发之 ---- 底层驱动开发
  5. div contenteditable disabled 失效问题
  6. 神华整体上市图景:一体化模式指向海外并购
  7. Epic Games和虚拟引擎
  8. CSS 揭秘-阅读笔记:(Ch5-Ch6)
  9. 降低模块间的耦合度的措施
  10. 在被受控节点上创建文件或目录