天天看點

如何修改 sensor 輸出幀率

在項目中我們經常有修改 sensor 輸出幀率的需求,目的可能是要通過降低幀率,來增加曝光時間,進而提升低照度下的圖像品質、或者是通過降低幀率,來減少傳輸帶寬、又或者是通過提高幀率,抓拍高速運動的物體等等。本文主要介紹的就是如何修改 sensor 的輸出幀率。

1、問題需求

以我目前在做的一個項目為例,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);

如何修改 sensor 輸出幀率
如何修改 sensor 輸出幀率
如何修改 sensor 輸出幀率

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