• 如何修改 sensor 输出帧率


    在项目中我们经常有修改 sensor 输出帧率的需求,目的可能是要通过降低帧率,来增加曝光时间,从而提升低照度下的图像质量、或者是通过降低帧率,来减少传输带宽、又或者是通过提高帧率,抓拍高速运动的物体等等。本文主要介绍的就如何修改 sensor 的输出帧率。

    1、问题需求

    以我目前在做的一个项目为例,用的是格科微的 GC4653 这款 sensor, sensor 原厂提供的 setting 是30fps,现在要求降低到 20fps,具体该如何修改呢?

    2、计算说明

    修改帧率一般是通过修改 VTS(也就是帧长) 来实现的,一帧图像的曝光时间 = 帧长 * 一行时间。提高帧长,1帧图像的曝光时间就变大了,单位时间内可曝光的帧数就少了,也就是帧率就下降了。所以通常也会通过降帧,来提高低照度下相机的性能。因为降帧后,每帧图像的曝光时间就变长了,相同照度下相比未降帧前,用到的sensor gain 就小,噪声情况就会有所改善,只要噪声小,能做的事情就多了,比如增加清晰度、提高亮度、调高色彩饱和度等等。
    修改帧率,首先要了解如下参数的计算公式:
    pclk = frame_length ∗ line_length * fps
    line_time = line_length/pclk 
    fps = pclk/(frame_length ∗ line_length)  = pclk /(frame_length ∗ pclk ∗ line_time) = 1/ (frame_length ∗ line_time)
    注:公式中的参数不理解的话,可查看这篇文章,CMOS Sensor 的一些基本概念,及曝光相关的计算 。
    主要就是通过如上公式计算出新的帧长,要求得帧长就必须先知道曝光一行的时间(line_time)和帧率,帧率是已知的,就是20fps。要求得一行时间(line_time),就必须知道行长 (line_length) 和pclk的值。
    首先我们先求pclk的值:pclk = frame_length ∗ line_length * fps,公式里的帧长和行长就是 VTS 和 HTS,这两个值默认的setting里就有,因为pclk是不变的,我们可以通过初始的30fps的setting来计算出 pclk 的值。
    如下图所示,从sensor datasheet 里可以找到对应VTS 和 HTS的寄存器地址,根据地址从 sensor 厂给的 setting 里找到其对应的值 VTS = 1500,HTS = 3200(datasheet中有注明,读出的值要 *2);

              

    3、计算结果

    pclk = frame_length ∗ line_length * fps = 1500 x 3200 x 30 = 144,000,000 
    line_time = line_length/pclk = 3200/144,000,000 = 0.022 ms
    VTS = frame_length = (1/fps) /line_time = ( 1/20 )s / 0.022ms  =  50 / 0.022 = 2273
    如上将 sensor setting 中 VTS 的值改成:0x0340 = 08,0x0341 = e1,sensor 输出帧率就由30fps 变为 20fps 了。

  • 相关阅读:
    LVS负载均衡群集NAT模式
    简单但现代的服务器仪表板Dashdot
    Android音频框架之OpenSL ES、AAudio、Oboe介绍(二)
    PyG MessagePassing机制源码分析
    element ui el-table表格纵向横向滚动条去除并隐藏空白占位列
    【Linux从入门到放弃】Linux基本指令大全
    某金融机构分布式数据库架构方案与运维方案设计分享
    【期末大作业】基于HTML+CSS+JavaScript网上订餐系统(23个页面)
    【附源码】计算机毕业设计java医院预约挂号管理系统设计与实现
    文心一言 VS 讯飞星火 VS chatgpt (102)-- 算法导论9.3 8题
  • 原文地址:https://blog.csdn.net/qq_35247586/article/details/126567136