dsj541kgh が 2026年02月19日06時43分55秒 に編集
初版
タイトルの変更
ローリングシャッターについて調べてみた
タグの変更
カメラ
記事種類の変更
セットアップや使用方法
Lチカの変更
本文の変更
# はじめに スマホカメラとSpresense HDRカメラのローリングシャッター速度を見てみました。 計測方法は、点滅LED(Lチカ)を写し込んで縦縞を読む方法で行いました。 以下のように縞1周期分の縦方向ピクセル数をカウントすると、これがLED点滅周期で読み込んだライン数になるという仕組みです。  上記画像ですと、画像の1行当たり読み込み時間は1/60 [s] ÷2374 [px] = 7.02... [us]みたいな感じになります。 # ローリングシャッター?&どうやって計測する? ローリングシャッター(RS)は、撮像センサが画面全体を同時刻に露光せず、走査(scan)しながら行ごとに順番に露光・読み出しすることです。撮影中にカメラまたは被写体が動くと、同一フレーム内で行ごとに撮影時刻が異なるため、直線が曲がったり、物体が傾いたりして、これをローリングシャッター歪みとか言います。 一方で、撮像センサを一度にすべて露光・読み出しするグローバルシャッターというものもあります。これはローリングシャッター歪みが原理的に発生しない非常に良いものではあるのですが、価格が高いです。 ローリングシャッターによる歪みには以下のようなものがある気がします。 - 高速パン(ヨー回転が大):角速度or並進速度 が大 → 縦線が斜め - 振動(角速度が時間変動):姿勢角が揺れる → jello(ゼリー) - プロペラ等(被写体側の高速運動):相対運動が大 → バナナ状・波打ち 諸説あるかと思いますが、以下にローリングシャッターカメラ撮影のざっくりした流れを示します。  画像の上から下に向かって読み出しを行っていくものとします。ローリングシャッターでは、行 $y$ の読み出しの代表時刻が $$t(y) = t_0 + y \, \tau$$ で表されます。 - $t_0$:フレームの先頭行の時刻 [s] - $\tau$:1行あたりの読み出し時間 [s] - $y$:行インデックス - $H$:画像全体の高さ [pixel] 全行の走査にかかる時間(1フレームの読み出し時間)は $$ T_{f} = H \, \tau $$ で表されます。この$T_{\text{f}}$ がローリングシャッター歪みの原因であり、これが短い画像ほどローリングシャッター歪みが少ないと思います。これについて色々考えてると、$\tau$を計測したくなってくるわけです。今回は以下の文献を参考に計測をしました。 Sheinin et al., “Rolling Shutter Imaging on The Electric Grid” (ICCP 2018) 先ほどの図で説明します。 - $L$:縞の長さ [pixel] - $T$:LEDの点滅周期 [s] - $T_{L}$:縞の長さ分の読み出し時間 [s] - $\tau$:1行あたりの読み出し時間 [s] 既知の周期$T$で点滅するLEDを写したときに現れる縞模様の長さ$L$で$T$を割ることで1行あたりの読み出し時間推定値 $\tau$が計算されます。なので1行あたりの読み出し時間の推定値は$\tau=T/L$で表されます。 ここで推定値と言ったのは、実際の縞の長さ$L$の読み出し時間$T_L$$\simeq$$T$であり、最大で1行あたりの読み出し時間分の誤差$|T_{L}-T|$を含むからです。 縞模様の読み方にはいろいろ方法があると思いますが、今回は少しでも点灯していれば点灯画素と判断し、点灯画素と完全に消灯した画素の境界を読み取ることにしています。 # 撮影結果 以下に、Pixel8a、Pixel4a、Spresense HDRカメラの結果を示します。 全てデューティー比50%の点滅LEDによって計測したものになります。 ## Pixel8a ### 50 Hz 1/50 [s] ÷2842[px] = 7.037... [us] 解像度:4624x3472 1フレームの読み込み時間:3472 [px] x 7.037 [us] = 24.43... [ms]  ### 60 Hz 1/60 [s] ÷2374 [px] = 7.020... [us] 解像度:4624x3472 1フレームの読み込み時間:3472 [px] x 7.020 [us] = 24.38... [ms]  ### 70Hz 1/70 [s] ÷2032 [px] = 7.030... [us] 解像度:4624x3472 1フレームの読み込み時間:3472 [px] x 7.030 [us] = 24.41... [ms]  ### 80 Hz 1/80 [s] ÷1778 [px] = 7.030... [us] 解像度:4624x3472 1フレームの読み込み時間:3472 [px] x 7.030 [us] = 24.41... [ms]  ### 90 Hz 1/90 [s] ÷1578 [px] = 7.041... [us] 解像度:4624x3472 1フレームの読み込み時間:3472 [px] x 7.041 [us] = 24.45... [ms]  ### 100 Hz 1/100 [s] ÷1422 [px] = 7.032... [us] 解像度:4624x3472 1フレームの読み込み時間:3472 [px] x 7.032 [us] = 24.42... [ms]  ### 150Hz 1/150 [s] ÷951 [px] = 7.010... [us] 解像度:4624x3472 1フレームの読み込み時間:3472 [px] x 7.010 [us] = 24.34... [ms]  ### 200 Hz 1/200[s] ÷711 [px] = 7.032... [us] 解像度:4624x3472 1フレームの読み込み時間:3472 [px] x 7.032 [us] = 24.42... [ms]  ### 250 Hz この画像は点滅周期に対して露光時間が長いので完全な消灯期間が見られません。なので、明暗差を何となく判別して縞の長さを計測します。 1/250 [s] ÷568 [px] = 7.042... [us] 解像度:4624x3472 1フレームの読み込み時間:3472 [px] x 7.042 [us] = 24.45... [ms]  ## Pixel4a 1/60 [s] ÷1567[px] = 10.64... [us] 解像度:4032x3024 1フレームの読み込み時間:3024 [px] x 10.64 [us] = 32.16... [ms]  ## Spresense HDRカメラ 1280x960 デフォルト この画像も先ほどと同様点滅周期に対して露光時間が長いので完全な消灯期間が見られません。しかも縞が単純な明暗ではなく三段階に分かれているように見えます。 とりあえず、明暗差を何となく判別して縞の長さを計測します。 1/60 [s] ÷580[px] = 28.74... [us] 解像度:1280x960 1フレームの読み込み時間:960[px] x 28.74 [us] = 27.59... [ms]  ## Spresense HDRカメラ 1280x960 HDR ON 露光2000us 1/60 [s] ÷577[px] = 28.89... [us] 解像度:1280x960 1フレームの読み込み時間:960[px] x 28.89 [us] = 27.73... [ms]  ## Spresense HDRカメラ 1280x960 HDR OFF 露光2000us 1/60 [s] ÷577[px] = 28.89... [us] 解像度:1280x960 1フレームの読み込み時間:960[px] x 28.89 [us] = 27.73... [ms]  ## Spresense HDRカメラ 320x240 HDR OFF 露光2000us 1/60 [s] ÷144[px] = 115.7... [us] 解像度:320x240 1フレームの読み込み時間:240[px] x 115.7[us] = 27.78... [ms]  # まとめ スマホカメラとSpresense HDRカメラは、1フレームの読み込み時間が20~30msくらいでした。 pixel8aについて、LED点滅周期の変化で1フレームの読み込み時間に大きな変化は見られませんでした。 Spresense HDRカメラについて、HDR機能の有無や解像度で読み込み時間に大きな変化は見られませんでした。