✖
手ぶれを無視できるシャッタースピード
手ブレについて考えたことがあるけど、ずばり焦点距離が x のとき、特定カメラの性能で 1px 以内に手ぶれが収まるシャッタースピードを求める関数が欲しかったので書いた。
/**
* `focalLength`mm の焦点距離のとき 1px 以内に手ぶれが収まる最低限のシャッタースピード
* `opts.sensorSize.width`: センササイズ (横)
* `opts.pixels.width`: ピクセル数 (横)
* `opts.jiggle_angle`: 手ぶれの角速度 (角度/秒)
*
* (focalLength * Math.tan(degreeToRadians(2) * speed)) / (opts.sensorSize.width / opts.pixels.width) == 1;
* focalLength * Math.tan(degreeToRadians(2) * speed) == (opts.sensorSize.width / opts.pixels.width);
* Math.tan(degreeToRadians(2) * speed) == (opts.sensorSize.width / opts.pixels.width) / focalLength;
* degreeToRadians(2) * speed == Math.atan( (opts.sensorSize.width / opts.pixels.width) / focalLength );
* speed == Math.atan( (opts.sensorSize.width / opts.pixels.width) / focalLength ) / degreeToRadians(2);
*/
function minimunSpeedByFocalLength (focalLength, opts) {
if (!opts) opts = {};
if (!opts.jiggle_angle) opts.jiggle_angle = minimunSpeedByFocalLength.JIGGLE_ANGLE.ADVANCED;
return Math.atan( (opts.sensorSize.width / opts.pixels.width) / focalLength ) / degreeToRadians(opts.jiggle_angle);
}
minimunSpeedByFocalLength.JIGGLE_ANGLE = { // 手ぶれ限界 角速度(角度/秒)
NOVICE : 5,
ADVANCED : 2
};
で
var sensorSize = {
width: 36,
height: 24
};
var pixels = {
width: 5616,
height: 3744
};
function show (f) {
var speed = 1 / minimunSpeedByFocalLength(f, {
sensorSize : sensorSize,
pixels : pixels
});
console.log("%dmm 1/%dsec (スピード%d倍=%d段)",
f,
Math.floor(speed),
~~(speed / f),
Math.sqrt(speed / f).toFixed(2)
);
}
// NOVICE
show(24); //=> 24mm 1/326sec (スピード13倍=3.69段)
show(50); //=> 50mm 1/680sec (スピード13倍=3.69段)
show(100); //=> 100mm 1/1361sec (スピード13倍=3.69段)
show(200); //=> 200mm 1/2722sec (スピード13倍=3.69段)
// ADVANCED
show(24); //=> 24mm 1/130sec (スピード5倍=2.33段)
show(50); //=> 50mm 1/272sec (スピード5倍=2.33段)
show(100); //=> 100mm 1/544sec (スピード5倍=2.33段)
show(200); //=> 200mm 1/1089sec (スピード5倍=2.33段)
手ぶれ補正4段分ぐらいあってようやく、いわゆる「焦点距離分の1」で手ブレが無視できるようになる。
画質の評価とかをする場合、十分にシャッタースピードが早いかを確認する必要がありそうだと思った。