【Camera基础(一)】Camera摄像头工作原理及整机架构

简介: 【Camera基础(一)】Camera摄像头工作原理及整机架构

一、摄像头的基本工作原理

如图所示,一个景象的反射光被镜头所捕捉(镜头的光圈可以调节进光量,马达用来调节对焦),最终将聚焦好的图像精准对焦到图片传感器上边(色彩滤波会产生三基色),光信号转化为数字信号,通过模数转换最终得到原始码流数据。

问题:那我们可以直接使用这个包含图像信息和颜色信息的原始码流数据吗?

答案:不能,要根据用户端请求的VC接口携带请求数据流的格式决定。

二、编码

摄像头软件层,一般会提供多种格式和分辨率的参数,供上层选择,常见的格式如:YUYV、MJPEG、H264、NV12等。其中:

  • YUYV:原始码流,每个像素点占2个字节。
  • MJPEG:可以将数据压缩7倍左右,可以是NV12也可以是YUYV
  • H264编码:主要看配置,其中I帧压缩7倍左右,P帧20倍左右,B帧50倍左右,理论上B帧越多,就可能支持的高分辨率高帧率的码流
  • NV12:原始码流,每个像素点1.5个字节。

三、编码的目的

如果没有编码,我们计算一下1s请求NV12 4K 30HZ的码流需要多大的带宽?
答案:(3840*2160*1.5*30)字节 = 373248000字节=356M

按照,我们整机常用的camera接口usb 2.0的理论带宽:480Mbps = 60M/s,

无法满足NV12原始码流4K 30HZ的预览要求的,编解码技术,可以有效的压缩数据的体积而不会或较少的影像画质。

四、传输

作为相机的数据传输协议,肯定是要统一的,广泛的,厂家和广大开发者支持的协议。其中USB协议肯定有一席之地。整机方案,基本采用的都是USB Camera方案。

UVC是USB Video Class的简写,也就是USB接口的视频设备。一个UVC设备,需包含1个VC Interface和1个或多个VS Interface

  • VC Interface进行配置参数的传递,如启动和关闭自动对焦,白平衡等。
  • VS Interface进行图片数据流的传输。

USB协议

UVC协议:

UVC模型:

UVC软件架构

小结:

在Linux系统中,应用层和USB相机通过UVC协议进行交互。系统为了兼容不同的交互协议。在kernel层抽象了V4L2驱动,方便上层进程和各个协议对接。

V4L2提供了一系列的命令,如图所示,上层进程通过ioctl和底层kernel交互。

如此,上层应用就能拿到相机设备给出的编码后的码流了。但是如果整机方案是Android系统,那和linux还是有着一定的不同的。Android系统可以向下,可以使V4l2通过ioctl和kernel交互。


五、Android系统的camera架构

Android APSP系统作为开源的系统,需要考虑很多因素,既要考虑下游硬件设备厂商,也要考虑应用开发者,还要考虑用户隐私安全。所以,Google对Android下的Camera的架构,分了3层设计。


  • CameraProvider hal层的进程,init rc启动时启动。
  • CameraServer Framework层进程,主要用于维护上层apk都可能访问Camera服务
  • Camera的Runtime层,为上层apk提供服务,并封装了一系列的api,方便广大开发者调用和快速开发。

Android camera架构图:


小结:

android系统通过分层设计,给到每个上层应用独立访问相机设备的能力,上层应用可以通过简单的api调用就可以实现相机的预览和拍照功能。

原始码流数据通过编码,把数据进行压缩通过USB送到kernel,kernel通过UVC协议Hal层进行交互,HAL层拿到数据后,CamerServer会通过hwbinder与Hal层进行交互,然后进行显示。


相关文章
|
1天前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
15天前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
78 4
|
15天前
|
存储 Dart 前端开发
flutter鸿蒙版本mvvm架构思想原理
在Flutter中实现MVVM架构,旨在将UI与业务逻辑分离,提升代码可维护性和可读性。本文介绍了MVVM的整体架构,包括Model、View和ViewModel的职责,以及各文件的详细实现。通过`main.dart`、`CounterViewModel.dart`、`MyHomePage.dart`和`Model.dart`的具体代码,展示了如何使用Provider进行状态管理,实现数据绑定和响应式设计。MVVM架构的分离关注点、数据绑定和可维护性特点,使得开发更加高效和整洁。
145 3
|
27天前
|
容器
Flutter&鸿蒙next 布局架构原理详解
Flutter&鸿蒙next 布局架构原理详解
|
1月前
|
前端开发 Java 应用服务中间件
21张图解析Tomcat运行原理与架构全貌
【10月更文挑战第2天】本文通过21张图详细解析了Tomcat的运行原理与架构。Tomcat作为Java Web开发中最流行的Web服务器之一,其架构设计精妙。文章首先介绍了Tomcat的基本组件:Connector(连接器)负责网络通信,Container(容器)处理业务逻辑。连接器内部包括EndPoint、Processor和Adapter等组件,分别处理通信、协议解析和请求封装。容器采用多级结构(Engine、Host、Context、Wrapper),并通过Mapper组件进行请求路由。文章还探讨了Tomcat的生命周期管理、启动与停止机制,并通过源码分析展示了请求处理流程。
|
1月前
|
存储 分布式计算 druid
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
51 3
|
1月前
|
消息中间件 分布式计算 druid
大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进
大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进
32 2
|
1月前
|
消息中间件 监控 Java
大数据-109 Flink 体系结构 运行架构 ResourceManager JobManager 组件关系与原理剖析
大数据-109 Flink 体系结构 运行架构 ResourceManager JobManager 组件关系与原理剖析
62 1
|
1月前
|
存储 网络协议 Unix
docker的底层原理一:客户端-服务器架构
本文详细解释了Docker的客户端-服务器架构,包括常驻后台的Docker守护进程、通过命令行接口发送请求的Docker客户端、以及它们之间通过Unix socket或网络接口进行的通信。
19 0
|
2月前
|
存储 SQL Cloud Native
Hologres 的架构设计与工作原理
【9月更文第1天】随着大数据时代的到来,实时分析和处理数据的需求日益增长。传统的数据仓库在处理大规模实时数据分析时逐渐显露出性能瓶颈。为了解决这些问题,阿里巴巴集团研发了一款名为 Hologres 的新型云原生交互式分析数据库。Hologres 能够支持 SQL 查询,并且能够实现实时的数据写入和查询,这使得它成为处理大规模实时数据的理想选择。
100 2