7

Matlab のカメラ キャリブレーション ツールボックスを使用して GoPro Hero 4 Black をキャリブレーションし、 OpenCVcalibrationMatrixValues()を使用してその視野と焦点距離を計算しました。ただし、これらは GoPro の仕様とは異なります。118.2/69.5 FOV の代わりに、17.2mm ではなく 95.4/63.4 と焦点距離 2.8mm が得られます。明らかに何かが間違っています。

画像の歪み補正がうまく機能しているように見えるので、キャリブレーション自体は正しいと思います。

誰が私が間違いを犯したのかヒントを教えてもらえますか? 以下にコードを掲載しています。

ありがとう。

コード

cameraMatrix = new Mat(3, 3, 6);
for (int i = 0; i < cameraMatrix.height(); i ++)
    for (int j = 0; j < cameraMatrix.width(); j ++) {
    cameraMatrix.put(i, j, 0);
}
cameraMatrix.put(0, 0, 582.18394);
cameraMatrix.put(0, 2, 663.50655);
cameraMatrix.put(1, 1, 582.52915);
cameraMatrix.put(1, 2, 378.74541);
cameraMatrix.put(2, 2, 1.);

org.opencv.core.Size size = new org.opencv.core.Size(1280, 720);
//output parameters
double [] fovx = new double[1];
double [] fovy = new double[1];
double [] focLen = new double[1];
double [] aspectRatio = new double[1];
Point ppov = new Point(0, 0);
org.opencv.calib3d.Calib3d.calibrationMatrixValues(cameraMatrix, size,
        6.17, 4.55, fovx, fovy, focLen, ppov, aspectRatio);


System.out.println("FoVx: " + fovx[0]);
System.out.println("FoVy: " + fovy[0]);
System.out.println("Focal length: " + focLen[0]);
System.out.println("Principal point of view; x: " + ppov.x + ", y: " + ppov.y);
System.out.println("Aspect ratio: " + aspectRatio[0]);

結果

FoVx: 95.41677635378488
FoVy: 63.43170132212425
Focal length: 2.8063085232812504
Principal point of view; x: 3.198308916796875, y: 2.3934605770833333
Aspect ratio: 1.0005929569269807

GoProの仕様

https://gopro.com/help/articles/Question_Answer/HERO4-Field-of-View-FOV-Information

編集

Matlab のキャリブレーション結果

Focal Length:          fc = [ 582.18394   582.52915 ] ± [ 0.77471   0.78080 ]
Principal point:       cc = [ 663.50655   378.74541 ] ± [ 1.40781   1.13965 ]
Skew:             alpha_c = [ -0.00028 ] ± [ 0.00056  ]   => angle of pixel axes = 90.01599 ± 0.03208 degrees
Distortion:            kc = [ -0.25722   0.09022   -0.00060   0.00009  -0.01662 ] ± [ 0.00228   0.00276   0.00020   0.00018  0.00098 ]
Pixel error:          err = [ 0.30001   0.28188 ]

キャリブレーションに使用した画像の 1 つ 13.jpg

そして歪みのないイメージ _rect13.jpg

4

1 に答える 1

6

6.17OpenCV でセンサー サイズにmm とmm を入力し4.55ました。これは縦横比に対応し1.36ますが、解像度 (1270x720) は1.76(約 16x9 形式) です。MATLAB キャリブレーションの前に画像をトリミングしましたか?

この Gopro ページから、ピクセル サイズは 1.55µm のようです(ちなみに、これは驚くほど小さいです!)。ピクセルが正方形であり、このタイプの商用カメラにあるはずである場合、それは入力が一貫していないことを意味します。計算されたセンサー サイズは次のようになります。

[センサー幅、センサー高さ] = [1280, 720]*1.55*10^-3 = [1.97, 1.12] mm

3840 x 2160 の最大ビデオ解像度を考慮しても[5.95, 3.35]mm、入力とは異なります。

カメラの実際の焦点距離が~ 2.8mmではない理由を理解するには、等価焦点距離に関するこの説明を参照してください。その場合、たとえばここの式を使用して FOV を計算します。実際に 93.5°/61.7° の値が見つかります (出力に近いですが、広角による光学的な歪みがある可能性があるため、仕様に記載されているものとは異なります)。 17.217.2*5.95/36

私が理解していないのは、入力されたセンサーサイズが間違っているのに、返された焦点距離がどのように正しいかということです。もっと情報を提供したり、画像を送っていただけますか?

質問の更新後の編集

そのカメラでは、1280x720 の作業解像度で、画像はダウンサンプリングされますがトリミングされないため、センサーの寸法について上で述べたことは当てはまりません。考慮すべきセンサーサイズは、最初のコメントで説明したように、実際に使用されているもの (6.17x4.55) です。

FOV は、ピクセルと解像度で指定されたキャリブレーション マトリックス入力 (fx、fy、cx、cy) によって制約されます。次のように入力して確認できます。

2*DEGRES(ATAN(1280/(2*582.18394)))(=95.416776...°)

この FOV 値は予想よりも小さくなっていますが、歪みのない画像を見ると、MATLAB 歪みモデルは正しく、キャリブレーションも正しいことがわかります。広角によるたる型の歪曲は、リワープによってうまく補正されているようです。

ただし、MATLAB ツールボックスはピンホール モデルを使用します。これは線形であり、レンズの歪みなどの固有パラメーターを考慮できません。私はページからこれを仮定します:

https://fr.mathworks.com/help/vision/ug/camera-calibration.html

したがって、Gopro カメラにより正確に適合するモデル (おそらく広角レンズ モデル) が見つからない限り、MATLAB キャリブレーションは「線形」の歪みのない画像に対応する固有のカメラ マトリックスを返し、FOV は実際により小さくなります (たる型歪みの場合)。実際の FOV 値を取得するには、キャリブレーションに関連付けられた歪み係数を適用する必要があります。

修正された画像では、FOV の側面部分が範囲外で拒否されていることがわかります。画像全体をワープした場合、歪みのないピクセル座標の一部が[-1280/2;+1280/2](水平方向に、垂直方向に同じ) 超えていることがわかります。次に、opencv.core.Size(1280, 720)得られた最も極端な範囲に置き換えて、うまくいけば Gopro Web サイトの値を取得できます。

結論として、画像の中心で測定を行う場合は、得られた焦点距離の値を信頼できると思います。そうしないと、歪みが大きすぎて適用されません。

于 2016-10-14T21:57:59.487 に答える