我是靠谱客的博主 坚强发卡,最近开发中收集的这篇文章主要介绍camera、sensor,v4l2基础知识v4l-utils工具包用法Media子系统和pipeline汇总,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

结构和工作原理

(1)、工作原理:物体通过镜头(lens)聚集的光,通过CMOS或CCD集成电路,把光信号转换成电信号,再经过内部图像处理器(ISP)转换成数字图像信号输出到数字信号处理器(DSP)加工处理,转换成标准的GRB、YUV等格式图像信号。

(2)、CCM 包含四大件: 镜头(lens)、传感器(sensor)、软板(FPC)、图像处理芯片(DSP)。决定一个摄像头好坏的重要部件是:镜头(lens)、图像处理芯片 (DSP)、传感器(sensor)。CCM的关键技术为:光学设计技术、非球面镜制作技术、光学镀膜技术。

Cmos内部结构

 

帧同步的逻辑关系

 

PCLK:是像素点同步时钟信号。也就是每个PCLK对应一个像素点。

VSYNC:是场同步信号。以高电平有效为例,VSYNC置高直到被拉低,这个区段所输出的所有影像数据组成一个frame。

HSYNC:是行同步信号。就是在告诉接收端:“HSYNC”有效时段内接收端接收到的所有的信号输出属同一行。

若要显示一个640x480的画面,显示不正确的时候,若量PCLK,VSYNC和HSYNC这三个信号,就可以知道这三个信号配置是否有问题,一般来讲,这种情况是有公式的:

VSync = HSYNC x 320;

Hsync = PCLK x 640;

软硬件的完整流程:

1.摄像头的初始化(输出格式、分辨率、输出速率)

2.使能摄像头接入主控板卡中的物理通道(mipi、cif也就是dvp;摄像头的dvp口传输协议和lcd ttl口协议差不多。)

3.使能主控板卡中的ISP(图像信号处理模块)、并让ISP知道当前有效接入的摄像头是哪一个(因为可以多个接入,但只能一个有效)。

4.告诉ISP输进来的数据如何处理(颜色空间转换、缩放、裁剪、旋转等)、经由那个通道输出到内存/显存(MP主通道、SP自身通道)。SP一般用来预览图片,SP图片的最大分辨率比MP低。

5.输出到内存

V4l2的采集过程(应用程序):

1)     打开设备,获得文件描述符;

2)     设置图片格式;

3)     分配缓冲区;

4)     启动采集过程,读取数据;

5)     停止采集,关闭设备。

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

一般来说,摄像头驱动需要实现与向核心层提交下面十几个ioctl接口

VIDIOC_REQBUFS:分配内存

VIDIOC_QUERYCAP:查询驱动功能

VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式

VIDIOC_S_FMT:设置当前驱动的频捕获格式

VIDIOC_G_FMT:读取当前驱动的频捕获格式

VIDIOC_TRY_FMT:验证当前驱动的显示格式

VIDIOC_CROPCAP:查询驱动的修剪能力

VIDIOC_S_CROP:设置视频信号的边框

VIDIOC_G_CROP:读取视频信号的边框

VIDIOC_QBUF:把数据放回缓存队列

VIDIOC_DQBUF:把数据从缓存中读取出来

VIDIOC_STREAMON:开始图像捕获

VIDIOC_STREAMOFF:结束图像捕获

1.V4L2 驱动中的核心结构体

v4l2_device;一个v4l2的总设备。

v4l2_sbudev:来描述camera等sensor设备,一般是指挂接在总线(i2c)上的摄像头

video_device:实际和处理器采集口相关的配置,一般该设备会完成注册以/dev/video0,video1的字符设备注册的形式暴露给应用层。

v4l-utils工具包用法

v4l-utils工具包中的:v4l2-ctl实现抓图。

V4l2-ctl 工具则是针对/dev/video0,/dev/video1 等 video设备,它在 video 设备上进行 set_fmt,reqbuf(申请buf),qbuf(送buf回队列),dqbuf(从队列取出buf),stream_on,stream_off 等一系列操作。

n为4的倍数(0,1,2,3...)

/dev/videon+0:视频输出 SP主通道

/dev/videon+1:视频输出 MP自身通道

/dev/videon+2:3A统计

/dev/videon+3:3A参数设置

打开v4l2中的ioctl调用开关:

echo 0x1f > /sys/class/video4linux/video0/dev_debug

echo 0x1f > /sys/class/video4linux/video1/dev_debug

echo 0x1f > /sys/class/video4linux/video2/dev_debug

echo 0x1f > /sys/class/video4linux/video3/dev_debug

设置 fmt 并抓帧:

板端:

v4l2-ctl -d /dev/video0 --set-selection=target=crop,width=1920,height=1080 --set-fmt-video=width=1280,height=720,pixelformat=NV21

--stream-mmap=3 --stream-to=mp.out --stream-count=1 --stream-poll

参数的说明:

    -d,指定操作对象为/dev/video0 设备。

    --set-selection=target=crop 设置裁剪功能,width=1920,height=1080 裁剪后的大小1920x1080

    --set-fmt-video,指定了宽高及 pxielformat。NV12,即用 FourCC 表示的 pixelformat。FourCC 编码详见下文 FourCC。

    --stream-mmap,指定 buffer 的类型为 mmap,即由 kernel 分配的物理连续的或经过iommu 映射的 buffer。

    --stream-to,指定帧数据保存的文件路径

    --stream-count,指定抓取的帧数, 不包括--stream-skip 丢弃的数量

--stream-poll,该选项指示 v4l2-ctl 采用异步 IO,即在 dqbuf 前先用 select 等等帧数据完成,从而保证 dqbuf 不阻塞。否则 dqbuf 将会阻塞直到有数据帧到来。

将mp.out推到ubantu上用mplayer打开它。

ubantu端:

W=1280; H=720; mplayer mp.out -loop 0 -demuxer rawvideo -fps 25 -rawvideo w=${W}:h=${H}:size=$((${W}*${H}*3/2)):format=nv21

    注意了抓图操作的pixelformat和mplayer播放的format需要一致。

前提是摄像头驱动和摄像头本身要支持nv12,分辨率也同理。

Media子系统和pipeline汇总

在rk 9.0之前还没有用meidia子系统,为了解决多媒体设备的复杂性和流动性,把多媒体各个模块树状链接,可以很方便的操作各个链接点的格式分辨率等。但是这样需要代码来支持,所以就用了media子系统,虽然增加了大段代码,但是这样操作更加灵活。

Media子系统是一种pipeline形式

Rk从sensor到ddr设定了4个设备如下

sensor —> DPHY —> isp —> stream

其中每个设备都认为是一个entity,是一个节点。每个都包含一个或者多个pads,可以认为是各个分叉,link就是将各个分叉pad链接起来,也就是谁链接谁。谁是源端,谁是目的端。

根据上图:

sensor有ov5695和ov2659,它们只有一个pad,因为只能输出

DPHY 就是mipi dphy 接收sensor数据,输出输出到isp,所有有2个pads

Isp 因为isp除了要接收dphy进来的数据,还要接收input参数,输出统计信息,最后将数据输出到 mainpath和selfpath(这个不清楚是否rkisp独有),4个pads

Mp和sp 接收isp处理好的数据 所以只有一个pad。

 

 

 

 

 

 

最后

以上就是坚强发卡为你收集整理的camera、sensor,v4l2基础知识v4l-utils工具包用法Media子系统和pipeline汇总的全部内容,希望文章能够帮你解决camera、sensor,v4l2基础知识v4l-utils工具包用法Media子系统和pipeline汇总所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(86)

评论列表共有 0 条评论

立即
投稿
返回
顶部