如何修改 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 了。

你可能感兴趣的:(如何修改 sensor 输出帧率)