V4L2简介

2023-05-16

http://work-blog.readthedocs.org/en/latest/v4l2%20intro.html

第一章 V4L2简介

1.1、什么是v4l2

V4L2(Video4Linux的缩写)是Linux下关于视频采集相关设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。

V4L2支持的设备十分广泛,但是其中只有很少一部分在本质上是真正的视频设备:

  • Video capture device : 从摄像头等设备上获取视频数据。对很多人来讲,video capture是V4L2的基本应用。设备名称为/dev/video,主设备号81,子设备号0~63
  • Video output device : 将视频数据编码为模拟信号输出。与video capture设备名相同。
  • Video overlay device : 将同步锁相视频数据(如TV)转换为VGA信号,或者将抓取的视频数据直接存放到视频卡的显存中。
  • Video output overlay device :也被称为OSD(On-Screen Display)
  • VBI device : 提供对VBI(Vertical Blanking Interval)数据的控制,发送VBI数据或抓取VBI数据。设备名/dev/vbi0~vbi31,主设备号81,子设备号224~255
  • Radio device : FM/AM发送和接收设备。设备名/dev/radio0~radio63,主设备号81,子设备号64~127

V4L2在Linux系统中的结构图如下:

_images/V4L2框图.png

V4L2简单框图

1.2、从应用层看V4L2

从V4L2简单框图可以看出,V4L2是一个字符设备,而V4L2的大部分功能都是通过设备文件的ioctl导出的。

**可以将这些ioctl分类如下**:

  1. Query Capability:查询设备支持的功能,只有VIDIOC_QUERY_CAP一个。
  2. 优先级相关:包括VIDIOC_G_PRIORITY,VIDIOC_S_PRIORITY,设置优先级。
  3. capture相关:视频捕获相关Ioctl。
capture ioctl list
ID 描述
VIDIOC_ENUM_FMT 枚举设备所支持的所有数据格式
VIDIOC_S_FMT 设置数据格式
VIDIOC_G_FMT 获取数据格式
VIDIOC_TRY_FMT 与VIDIOC_S_FMT一样,但不会改变设备的状态
VIDIOC_REQBUFS 向设备请求视频缓冲区,即初始化视频缓冲区
VIDIOC_QUERYBUF 查询缓冲区的状态
VIDIOC_QBUF 从设备获取一帧视频数据
VIDIOC_DQBUF 将视频缓冲区归回给设备,
VIDIOC_OVERLAY 开始或者停止overlay
VIDIOC_G_FBUF 获取video overlay设备或OSD设备的framebuffer参数
VIDIOC_S_FBUF 设置framebuffer参数
VIDIOC_STREAMON 开始流I/O操作,capture or output device
VIDIOC_STREAMOFF 关闭流I/O操作
  1. TV视频标准:
TV Standard
ID 描述
VIDIOC_ENUMSTD 枚举设备支持的所有标准
VIDIOC_G_STD 获取当前正在使用的标准
VIDIOC_S_STD 设置视频标准
VIDIOC_QUERYSTD 有的设备支持自动侦测输入源的视频标准,此时使用此ioctl查询侦测到的视频标准
  1. input/output:
Input / Output
ID 描述
VIDIOC_ENUMINPUT 枚举所有input端口
VIDIOC_G_INPUT 获取当前正在使用的input端口
VIDIOC_S_INPUT 设置将要使用的input端口
VIDIOC_ENUMOUTPUT 枚举所有output端口
VIDIOC_G_OUTPUT 获取当前正在使用的output端口
VIDIOC_S_OUTPUT 设置将要使用的output端口
VIDIOC_ENUMAUDIO 枚举所有audio input端口
VIDIOC_G_AUDIO 获取当前正在使用的audio input端口
VIDIOC_S_AUDIO 设置将要使用的audio input端口
VIDIOC_ENUMAUDOUT 枚举所有audio output端口
VIDIOC_G_AUDOUT 获取当前正在使用的audio output端口
VIDIOC_S_AUDOUT 设置将要使用的audio output端口
  1. controls:设备特定的控制,例如设置对比度,亮度
controls
ID 描述
VIDIOC_QUERYCTRL 查询指定control的详细信息
VIDIOC_G_CTRL 获取指定control的值
VIDIOC_S_CTRL 设置指定control的值
VIDIOC_G_EXT_CTRLS 获取多个control的值
VIDIOC_S_EXT_CTRLS 设置多个control的值
VIDIOC_TRY_EXT_CTRLS 与VIDIOC_S_EXT_CTRLS相同,但是不改变设备状态
VIDIOC_QUERYMENU 查询menu
  1. 其他杂项:
controls
ID 描述
VIDIOC_G_MODULATOR  
VIDIOC_S_MODULATOR  
VIDIOC_G_CROP  
VIDIOC_S_CROP  
VIDIOC_G_SELECTION  
VIDIOC_S_SELECTION  
VIDIOC_CROPCAP  
VIDIOC_G_ENC_INDEX  
VIDIOC_ENCODER_CMD  
VIDIOC_TRY_ENCODER_CMD  
VIDIOC_DECODER_CMD  
VIDIOC_TRY_DECODER_CMD  
VIDIOC_G_PARM  
VIDIOC_S_PARM  
VIDIOC_G_TUNER  
VIDIOC_S_TUNER  
VIDIOC_G_FREQUENCY  
VIDIOC_S_FREQUENCY  
VIDIOC_G_SLICED_VBI_CAP  
VIDIOC_LOG_STATUS  
VIDIOC_DBG_G_CHIP_IDENT  
VIDIOC_S_HW_FREQ_SEEK  
VIDIOC_ENUM_FRAMESIZES  
VIDIOC_ENUM_FRAMEINTERVALS  
VIDIOC_ENUM_DV_PRESETS  
VIDIOC_S_DV_PRESET  
VIDIOC_G_DV_PRESET  
VIDIOC_QUERY_DV_PRESET  
VIDIOC_S_DV_TIMINGS  
VIDIOC_G_DV_TIMINGS  
VIDIOC_DQEVENT  
VIDIOC_SUBSCRIBE_EVENT  
VIDIOC_UNSUBSCRIBE_EVENT  
VIDIOC_CREATE_BUFS  
VIDIOC_PREPARE_BUF  

v4l2设备的基本操作流程如下:

  1. **打开设备**,例如 fd = open("/dev/video0",0)
  2. 查询设备能力. 例如:

struct capability cap;
ioctl(fd,VIDIOC_QUERYCAP,&cap)
  
  1. 设置优先级(可选).
  2. **配置设备**。包括:
  • 视频输入源的视频标准,VIDIOC_*_STD
  • 视频数据的格式 , VIDIOC_*_FMT
  • 视频输入端口, VIDIOC_*_INPUT
  • 视频输出端口,VIDIOC_*_OUTPUT
  1. **启动设备开始I/O操作**。V4L2支持一下三种I/O方式:

    • **Read/Write**:通过调用设备节点文件的Read/Write函数,与设备交互数据。打开设备后,默认使用的是此方法。
    • **Stream I/O**:流操作,只传递数据缓冲区指针,不拷贝数据。使用此方法,需要调用VIDIOC_REQBUFS ioctl来通知设备。流操作I/O有两种方式memory map和user buffer。(具体区别后面章节介绍)
    • overlay : 也可以理解为memory to memory 传输。将数据从内存拷贝到显存中。overlay设备独有的。

    对于Capture device可以以如下方式启动设备:

    • 调用VIDIOC_REQBUFS ioctl来分配缓冲区队列;
    • 调用VIDIOC_STREAMON ioctl通知设备开始stream IO
    • 调用VIDIOC_QBUF ioctl从设备获取一帧视频数据;
    • 使用完数据后,调用VIDIOC_DQBUF将缓冲区还给设备,以便设备填充下一帧数据。
  2. 释放资源并关闭设备。

1.3、从驱动层看V4L2

在驱动层,V4L2为驱动编写者做了很多工作。只需要实现硬件相关的代码,并且注册相关设备即可。

硬件相关代码的编写,除了编写具体硬件的控制代码外,最主要的就是将代码与V4L2框架绑定。绑定主要分为以下两个部分:

  • 关系绑定:也就是要将我们自己的结构体,与V4L2框架中相关连的结构体绑定在一起。
  • iocontrol等函数绑定:将V4L2所定义的空的函数指针,与自己的函数绑定在一起。

3.1 关系绑定

提到关系绑定,就必须介绍下V4L2几个重要结构体。

  • struct video_device:主要的任务就是负责向内核注册字符设备
  • struct v4l2_device:一个硬件设备可能包含多个子设备,比如一个电视卡除了有capture设备,可能还有VBI设备或者FM tunner。而v4l2_device就是所有这些设备的根节点,负责管理所有的子设备。
  • struct v4l2_subdev:子设备,负责实现具体的功能。

v4l2_device,v4l2_subdev可以看作所有设备和子设备的基类。我们在编写自己的驱动时,往往需要继承这些设备基类,添加一些自己的数据成员。例如第三章要讲到的soc_camera_host结构体,就是继承v4l2_device,并添加了互斥锁、子设备列表等成员变量。

_images/v4l2-intro.png

v4l2 framework 简略版

绑定的基本流程

  • 根据需要”重载”v4l2_device或v4l2_subdev结构体,添加需要的结构体成员。例如 :

    • linux/include/media/soc_camera.h文件中soc_camera_host重载了v4l2_device:

      
      struct soc_camera_host {
      struct v4l2_device v4l2_dev;
      struct list_head list;
      struct mutex host_lock;         /* Protect during probing */
      unsigned char nr;               /* Host number */
      void *priv;
      const char *drv_name;
      struct soc_camera_host_ops *ops;
      };
        
    • linux/drivers/media/video/Ml86v7667.c中ml86v7667_priv结构体”重载”了v4l2_subdev:

      
        struct ml86v7667_priv {
            struct v4l2_subdev                sd;
            struct v4l2_ctrl_handler  hdl;
            v4l2_std_id                       std;
        };
        
  • v4l2_device与V4L2框架的绑定:通过调用v4l2_device_register函数实现。例如,上面提到的soc_camera_host的绑定:

    
    int soc_camera_host_register(struct soc_camera_host *ici)
    {
          struct soc_camera_host *ix;
          int ret;
    
          if (!ici || !ici->ops ||
            !ici->ops->try_fmt ||
            !ici->ops->set_fmt ||
            !ici->ops->set_bus_param ||
            !ici->ops->querycap ||
            ((!ici->ops->init_videobuf ||
            !ici->ops->reqbufs) &&
            !ici->ops->init_videobuf2) ||
            !ici->ops->add ||
            !ici->ops->remove ||
            !ici->ops->poll ||
            !ici->v4l2_dev.dev)
              return -EINVAL;
    
          if (!ici->ops->set_crop)
              ici->ops->set_crop = default_s_crop;
          if (!ici->ops->get_crop)
              ici->ops->get_crop = default_g_crop;
          if (!ici->ops->cropcap)
              ici->ops->cropcap = default_cropcap;
          if (!ici->ops->set_parm)
              ici->ops->set_parm = default_s_parm;
          if (!ici->ops->get_parm)
              ici->ops->get_parm = default_g_parm;
          if (!ici->ops->enum_fsizes)
              ici->ops->enum_fsizes = default_enum_fsizes;
    
          mutex_lock(&list_lock);
          list_for_each_entry(ix, &hosts, list) {
              if (ix->nr == ici->nr) {
                  ret = -EBUSY;
                  goto edevreg;
              }
          }
    
          ret = v4l2_device_register(ici->v4l2_dev.dev, &ici->v4l2_dev);
          if (ret < 0)
              goto edevreg;
    
          list_add_tail(&ici->list, &hosts);
          mutex_unlock(&list_lock);
    
          mutex_init(&ici->host_lock);
          scan_add_host(ici);
    
          return 0;
    
          edevreg:
          mutex_unlock(&list_lock);
          return ret;
      }
      
  • v4l2_subdev与v4l2_device的绑定:通过v4l2_device_register_subdev函数,将subdev注册到根节点上。例如:

    
    static int soc_camera_platform_probe(struct platform_device *pdev)
    {
        struct soc_camera_host *ici;
        struct soc_camera_platform_priv *priv;
        struct soc_camera_platform_info *p = pdev->dev.platform_data;
        struct soc_camera_device *icd;
        int ret;
    
        if (!p)
    	return -EINVAL;
    
        if (!p->icd) {
    	    dev_err(&pdev->dev,
    		    "Platform has not set soc_camera_device pointer!\n");
    	    return -EINVAL;
        }
    
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
    	    return -ENOMEM;
    
        icd = p->icd;
    
        /* soc-camera convention: control's drvdata points to the subdev */
        platform_set_drvdata(pdev, &priv->subdev);
        /* Set the control device reference */
        icd->control = &pdev->dev;
    
        ici = to_soc_camera_host(icd->parent);
    
        v4l2_subdev_init(&priv->subdev, &platform_subdev_ops);
        v4l2_set_subdevdata(&priv->subdev, p);
        strncpy(priv->subdev.name, dev_name(&pdev->dev), V4L2_SUBDEV_NAME_SIZE);
    
        ret = v4l2_device_register_subdev(&ici->v4l2_dev, &priv->subdev);
        if (ret)
    	    goto evdrs;
    
        return ret;
    
      evdrs:
        platform_set_drvdata(pdev, NULL);
        kfree(priv);
        return ret;
    }
      
  • video_device与v4l2_device的绑定:将v4l2_device的地址赋值给video_device的v4l2_dev即可。

此步不一定必要。只要有办法通过文件节点file(struct file)找到v4l2_device即可。

3.2 函数绑定

在v4l2 framework 简略版图中,绿色的方框都是需要我们绑定并实现的。

其中v4l2_file_operations和v4l2_ioctl_ops是必须实现的。而v4l2_subdev_ops下的八类ops中,v4l2_subdev_core_ops是必须实现的,其余需要根据设备类型选择实现的。比如video capture类设备需要实现v4l2_subdev_core_ops, v4l2_subdev_video_ops。

  • v4l2_file_operations:实现文件类操作,比如open,close,read,write,mmap等。但是ioctl是不需要实现的,一般都是用video_ioctl2代替。例如linux/drivers/media/video/soc_camera.c文件中soc_camera_fops的实现:

static struct v4l2_file_operations soc_camera_fops = {
    .owner          = THIS_MODULE,
    .open           = soc_camera_open,
    .release        = soc_camera_close,
    .unlocked_ioctl = video_ioctl2,
    .read           = soc_camera_read,
    .mmap           = soc_camera_mmap,
    .poll           = soc_camera_poll,
};
  
  • v4l2_ioctl_ops:V4L2导出给应用层使用的所有ioctl都是在这个地方实现的。但不必全部实现,只实现自己相关的ioctl即可。例如linux/drivers/media/video/soc_camera.c中soc_camera_ioctl_ops的实现:

static const struct v4l2_ioctl_ops soc_camera_ioctl_ops = {
    .vidioc_querycap         = soc_camera_querycap,
    .vidioc_try_fmt_vid_cap  = soc_camera_try_fmt_vid_cap,
    .vidioc_g_fmt_vid_cap    = soc_camera_g_fmt_vid_cap,
    .vidioc_s_fmt_vid_cap    = soc_camera_s_fmt_vid_cap,
    .vidioc_enum_fmt_vid_cap = soc_camera_enum_fmt_vid_cap,
    .vidioc_enum_input       = soc_camera_enum_input,
    .vidioc_g_input          = soc_camera_g_input,
    .vidioc_s_input          = soc_camera_s_input,
    .vidioc_s_std            = soc_camera_s_std,
    .vidioc_g_std            = soc_camera_g_std,
    .vidioc_enum_framesizes  = soc_camera_enum_fsizes,
    .vidioc_reqbufs          = soc_camera_reqbufs,
    .vidioc_querybuf         = soc_camera_querybuf,
    .vidioc_qbuf             = soc_camera_qbuf,
    .vidioc_dqbuf            = soc_camera_dqbuf,
    .vidioc_create_bufs      = soc_camera_create_bufs,
    .vidioc_prepare_buf      = soc_camera_prepare_buf,
    .vidioc_streamon         = soc_camera_streamon,
    .vidioc_streamoff        = soc_camera_streamoff,
    .vidioc_cropcap          = soc_camera_cropcap,
    .vidioc_g_crop           = soc_camera_g_crop,
    .vidioc_s_crop           = soc_camera_s_crop,
    .vidioc_g_parm           = soc_camera_g_parm,
    .vidioc_s_parm           = soc_camera_s_parm,
    .vidioc_g_chip_ident     = soc_camera_g_chip_ident,
#ifdef CONFIG_VIDEO_ADV_DEBUG
    .vidioc_g_register       = soc_camera_g_register,
    .vidioc_s_register       = soc_camera_s_register,
#endif
};
  
  • v4l2_subdev_ops:v4l2_subdev有可能需要实现的ops的总合。分为8类,core,audio,video,vbi,tuner......等。例如,

    linuxdriversmediavideosoc_camera_platform.c中platform_subdev_ops的实现


static struct v4l2_subdev_video_ops platform_subdev_video_ops = {
    .s_stream       = soc_camera_platform_s_stream,
    .enum_mbus_fmt  = soc_camera_platform_enum_fmt,
    .cropcap        = soc_camera_platform_cropcap,
    .g_crop         = soc_camera_platform_g_crop,
    .try_mbus_fmt   = soc_camera_platform_fill_fmt,
    .g_mbus_fmt     = soc_camera_platform_fill_fmt,
    .s_mbus_fmt     = soc_camera_platform_fill_fmt,
    .g_mbus_config  = soc_camera_platform_g_mbus_config,
};

static struct v4l2_subdev_ops platform_subdev_ops = {
    .core   = &platform_subdev_core_ops,
    .video  = &platform_subdev_video_ops,
};
  

函数绑定只是将驱动所实现的函数赋值给相关的变量即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

V4L2简介 的相关文章

  • UVC V4L2的实现

    linux 4 19 125 drivers media usb uvc uvc v4l2 c 1 uvc ops const struct v4l2 file operations uvc fops owner THIS MODULE o
  • Linux下V4L2调用摄像头设备程序崩溃

    问题描述 使用V4L2驱动调用摄像头 xff0c 只能打开一次摄像头 xff0c 第二次打开时程序崩溃 原因 在获取相机数据流时我们一般会使用mmap 来将linux内核空间映射到用户空间 xff0c 在关闭相机时应当调用munmap 解除
  • v4l2接口解析和摄像头数据采集

    V4L2接口解析 操作步骤 应用程序通过V4L2接口采集视频数据步骤 打开视频设备文件 xff0c 通过视频采集的参数初始化 xff0c 通过V4L2接口设置视频图像属性 申请若干视频采集的帧缓存区 xff0c 并将这些帧缓冲区从内核空间映
  • V4L2视频驱动框架简述(转载)

    摘自 xff1a https blog csdn net LinuxArmbiggod article details 80310445 V4L2视频驱动框架简述 奶牛养殖场小马 2018 05 14 15 40 1013469 收藏 76
  • V4l2框架分析

    Table of Contents 1 V4L2框架概述 1 1 v4l2设备应用层流程 1 2 内核V4L2模块 1 2 1 video device 1 2 2 v4l2 subdev 1 2 3 videobuf2 2 video d
  • Linux之V4L2驱动框架

    目录 一 V4L2简介 二 V4L2操作流程 1 打开摄像头 2 查询设备的属性 能力 功能 3 获取摄像头支持的格式 4 设置摄像头的采集通道 5 设置 获取摄像头的采集格式和参数 6 申请帧缓冲 内存映射 入队 xff08 1 xff0
  • USB摄像头驱动配置及V4L2编程

    1 摄像头驱动开发 1 1 摄像头软件系统架构 摄像头系统架构分为四层 xff1a 摄像头 支持V4L2的摄像头驱动 V4L2核心 应用程序 V4L2核心是Linux系统自带的组件 xff0c 它可以屏蔽摄像头驱动层的差异 xff0c 不管
  • V4L2框架

    前言 在分析v4l2之前最好具有的知识 xff1a 1 字符设备 因为v4l2是被枚举为字符设备 2 内存分配和映射 比如相关数据结构的分配和buffer 3 DMA xff0c 因为v4l2的数据传输用到了DMA 4 I2C xff0c
  • V4L2驱动架构简述

    多图 具体内容有空补充 xff0c 或直接看最后链接 朴素描述 xff1a camera 是一个集成 soc xff0c 挂载在 platform 总线上 xff0c 属于 platform device xff0c 相应驱动为 platf
  • V4L2简介

    http work blog readthedocs org en latest v4l2 20intro html 第一章 V4L2简介 1 1 什么是v4l2 V4L2 xff08 Video4Linux的缩写 xff09 是Linux
  • Linux下摄像头应用编程

    Linux下摄像头应用编程 V4L2是Video for linux2的简称 为linux中关于视频设备的内核驱动 在Linux中 视频设备是设备文件 可以像访问普通文件一样对其进行读写 摄像头在 dev video 下 如果只有一个视频设
  • 如何写入/传输到 V4L2loopback 模块创建的虚拟网络摄像头?

    我编写了一个应用程序 它从网络摄像头读取数据并在 Linux 上使用 OpenCV 处理帧 现在我想将应用程序的输出通过管道传输到由 V4L2loopback 模块创建的虚拟网络摄像头 以便其他应用程序能够读取它 我使用 C 编写了该应用程
  • 如何在 Linux UVC 驱动程序中启用 UVC_QUIRK_FIX_BANDWIDTH 怪癖?

    我目前正在尝试运行 2webcams在 Wandboard 板上 它们必须共享 USB 集线器 问题是 当前的驱动程序实现 仅限 YUV 使 USB 集线器饱和 最终我只能连接一台相机 然而 UVC 驱动程序的实现有一个怪癖kind情况等
  • 用于从视频源(网络摄像头)发出新帧信号的 Gstreamer 消息

    我正在尝试使用 gstreamer 将网络摄像头的流保存为一系列图像 到目前为止我已经写了这段代码 usr bin python import sys os import pygtk gtk gobject import pygst pyg
  • V4l2 上的 OpenCV 输出

    我想知道是否可以使用 opencv 在 v4l2 设备上写入 我会拍一张照片 利用 opencv 的功能进行一些小的更改 然后将其发送到 v4l2 设备上 我在网上搜索了一下 但是有很多关于如何从V4L2设备读取的示例 但我没有找到关于在v
  • 列出可用的捕获格式

    作为 V4L 的新手 我决定开始使用 video4linux2 库 以便用 C 语言从我的相机捕获帧 我正在将 uvcvideo 模块与 Ricoh Co 相机一起使用 我遵循了一些指南和教程 并设法获得了一个正在运行的程序 我的问题主要是
  • python中的用户指针

    我正在尝试显示使用 v4l 捕获的网络摄像头的预览 下面是代码的大概样子 from ctypes import from v4l2 import from Image import fromstring from Tkinter impor
  • v4l2 fcntl.ioctl VIDIOC_S_PARM 用于设置相机捕获的 fps 和分辨率

    我正在尝试设置网络摄像头的 fps 和分辨率 并通过 v4l2 Python 进行捕获 v4l2 Python 文档仅限于 gt gt gt import v4l2 gt gt gt import fcntl gt gt gt vd ope
  • OpenCV 从相机捕获 YUYV,无需 RGB 转换

    我尝试使用 openCV c 从 LI USB30 V024 立体相机捕获左右图像 而不自动将其转换为 RGB 相机输出 YUYV 格式的图像 我尝试使用 videoCapture set CV CAP PROP CONVERT RGB f
  • modprobe:错误:无法插入“v4l2loopback”:模块中的未知符号或未知参数(请参阅 dmesg)

    我正在尝试在 AWS EC2 实例上设置虚拟 v4l2 设备 我做了 apt installv4l2loopback dkms and v4l2loopback utils 当我尝试使用以下命令设置设备时出现以下错误 sudo modpro

随机推荐

  • MFC计算机图形学(3)

    之前我们已经可以画出直线和曲线了 但是算法虽容易理解 xff0c 但是复杂度高 xff0c 今天就介绍比较流行的DDA画线法 xff0c 还有 xff0c 对鼠标进行事件有所响应 xff0c 即 xff0c 在画板上 xff0c 鼠标左键单
  • Ubuntu18.04安装realsense viewer

    一 下载realsense安装包 mkdir p librealsense install cd librealsense install git clone b v2 31 0 https github com IntelRealSens
  • 用D435i录制自己的数据集运行ORBslam2并构建稠密点云

    一 录制rosbag 二 播放rosbag并用rviz查看topic xff0c 记下rgb和depth流话题名 三 用如下脚本 xff08 python2而不是3 xff09 保存rgb和depth图片同时生成rgb txt depth
  • Unrecoverable error: corrupted cluster config file.

    from https www cnblogs com topicjie p 7603227 html 缘起 正在欢乐的逗着孩子玩耍 xff0c 突然间来了一通电话 xff0c 值班人员告诉我误重启了一台服务器 xff0c 是我负责的服务 x
  • 树莓派3B+无屏幕和键盘配置树莓派WiFi和SSH

    前言 树莓派3B 43 安装系统Raspbian xff0c 默认的SSH是关闭的 xff0c 如何在无屏幕和键盘的情况下 xff0c 让笔记本通过WIFI访问树莓派 树莓派3B 43 发布后不久 xff0c 树莓派官方 Raspbian
  • ubuntu分区设置

    ubuntu分区设置 swap区 xff1a 逻辑分区 xff0c 虚拟内存类似 xff0c 大小和电脑内存一样大 xff1b boot区 xff1a 主分区 xff0c 引导系统的 xff0c 分配200M 500M xff0c 条件好些
  • 图像系统概述和名词解析

    图像系统组成 光源 xff08 包含人造光 自然光 闪光灯 xff09 照到物体上 xff0c 光线反射进入成像系统 xff0c 经过镜头 xff08 对于变焦镜头有驱动马达调整镜片位置 xff0c 实现变焦 xff09 光圈 滤光片 快门
  • 海思IQ图像清晰度调试策略

    总策略 影响清晰度的关键指标 xff1a 锐度 噪点和gamma Gamma调试步骤 YUVsharpen锐度调试 LDCI局部对比度调节 Dehaze调节 去雾算法主要用在有场景中做处理 xff0c 调整图像的对比度使更加清 去雾算法主要
  • 海思ISP曝光调整策略

    AE曝光调整 Exposure Attr 影响参数 xff1a ExpTimeRange Min Max 曝光时间Gain 各种增益控制Speed 曝光速度 xff08 影响到曝光收敛 xff0c AE闪烁 xff09 Compensati
  • ADS(ARM Developer Suite)安装与卸载中的问题(转)

    ADS用来对ARM的裸机代码进行编辑和调试 我在安装ADS1 2的过程中 xff0c 遇到了一个小问题 xff0c 写下来和大家分享一下解决方法 1 在安装程序 xff0c 进度条到100 时 xff0c 会一直停在那 xff0c 十几分钟
  • ucosIII 学习资料汇总

    网站 书籍 1 嵌入式实时操作系统uc OS III 邵贝贝译 这本书其实就是一本工具书 xff0c 我参考了官方的说明文档 xff0c 发现雷同很高 感觉就是官方说明文档翻译的 xff0c 用来应用查查接口还有点用 xff0c 不是十分推
  • USB协议传输结构

    USB作为数据通信标准 xff0c 固件可分为枚举配置和类协议部分 xff0c 枚举配置实现USB主机对设备的枚举和配置 xff0c 类协议实现设备各自的数据传输 usb2 0协议chapter8 protocol layer 1 USB协
  • 蓝牙HCI协议

    HCI 层位于蓝牙高层协议和低层协议之间 xff0c 提供了对基带控制器和链路管理器的命令以及访问蓝牙硬件的统一接口 它是我们实现自己的蓝牙设备要接触的第一个蓝牙协议 起着承上启下的作用 HCI通过包的方式来传送数据 命令和事件的 xff0
  • 标准USB设备请求命令

    一 标准的usb设备请求命令 控制传输是最重要和结构最复杂的一种传输类型 控制传输的 初始设置步骤 中包含了1 个8 字节的DATA0 数据包 参见图6 6 这8 字节的数据包是主机用来发送控制阶段中的请求命令的 而这些请求命令是主机配置U
  • 卡尔曼滤波基本公式推导(高斯乘积法)

    前言 卡尔曼滤波的推导这里给出两种推导方法 xff1a 一种是利用高斯乘积定理和贝叶斯公式推导出来 的 xff0c 另一种借用的是最小误差的思想 xff08 IMSE xff09 关于卡尔曼滤波的应用场景以及通俗的解释 xff0c 我相信各
  • 计算机组成原理(唐朔飞)

    计算机组成原理 唐朔飞 存储器 存储器分类 存储介质分类 半导体存储器磁表面存储器磁芯存储器 淘汰 存储方式 存储结构 存储器容量 地址总线 xff1a CPU能访问的地址宽度 xff0c 32地址线表示能访问2的32次方个存储单元地址 数
  • ubuntu配置静态IP、DNS地址

    虚拟机需要使用桥接上网 1 ifconfig 查看网卡信息 2 vi etc network interfaces 打开并编辑配置文件 配置说明 xff1a auto lo iface lo inet loopback auto ens33
  • c调用libcurl库发送GET 和 POST请求

    libcrul请求的基本套路流程 1 调用curl global init 初始化libcurl2 调用curl easy init 函数得到 easy interface型指针3 调用curl easy setopt 设置传输选项4 根据
  • LINUX 操作GPIO口

    两种方法 1 写驱动的方式 缺 2 通过linux提供的用户空间 终端控制 通过在用户空间上来操作GPIO xff0c 控制入口在 xff1a sys class gpio 首先确认内核里是否已选择上gpiolib的sysfs接口功能 默认
  • V4L2简介

    http work blog readthedocs org en latest v4l2 20intro html 第一章 V4L2简介 1 1 什么是v4l2 V4L2 xff08 Video4Linux的缩写 xff09 是Linux