2015-12-16 387 views
6

OpenCVを使用して魚眼レンズカメラで撮影した画像を校正しています。私が使用していますOpenCV魚眼校正では画像が大きくカットされます

機能は以下のとおりです。

  • findChessboardCorners(...);は、キャリブレーションパターンのコーナーを見つけること。
  • cornerSubPix(...);見つかったコーナーを細かくする。
  • fisheye::calibrate(...);カメラマトリックスと歪み係数を較正する。
  • fisheye::undistortImage(...);較正から得られたカメラ情報を使用して画像を歪ませないようにします。

結果の画像がよく見える(直線など)ように見えますが、私の問題は、画像があまりにも多く画像を切り取ってしまうことです。

私はそれらの間に90度の4つのカメラを使用しているので、これは本当の問題です。側面の多くが切り取られていると、それらの間に重複する領域はありません。画像。

私はfisheye::estimateNewCameraMatrixForUndistortRectify(...)を使用してに見えたが、私は、私はR入力として置くべきかわからないようfisheye::calibrateの回転ベクトルの出力は、Nは数ある3XN(あるとして、私は、それが良い結果を与えることを得ることができませんでした)、fisheye::estimateNewCameraMatrixForUndistortRectifyには1x3または3x3が必要です。

以下の画像は、私の歪みのない結果のイメージと、私が理想的に望む結果の例を示しています。

歪み補正:指名手配結果の

My undistortion

例:

Example of wanted result

答えて

0

あなたは罰金をやっている、あなただけのundistort()newCameraMatrixを設定するgetOptimalNewCameraMatrix()を使用する必要があります。すべてのピクセルを表示するには、にalphaを1に設定する必要があります。

+0

私は、それは私が望んでいた結果の種類を与えた(OpenCVのサンプルフォルダ内の画像を使用して)こと、および定期的なイメージにしようとした私は私の魚眼画像にそれを使用する場合しかし、それは与えるものではありません欲しい結果。 – NoShadowKick

+0

[私の結果の画像を表示フォルダ](https://www.dropbox.com/sh/pkudy2acgqyyjc5/AAAWE5cMEiT6dGB0hwDnVm69a?dl=0) – NoShadowKick

+0

あなたのイメージは非常に広角カメラ(〜180度FOV)からであるように見えます。あなたはすべてのピクセルを含めたい場合 - あなたは(メインカメラ軸> = 180からの角度を持つピクセルは無限大に投影されることになるので)、無限のサイズの画像を作成する必要があります。したがって、有限のサイズの画像を取得するには、その一部を破棄する必要があります。ところで、どのアルファを使ったのですか? – alexisrozhkov

2

私は魚眼レンズのgetOptimalNewCameraMatrixで "alpha"ノットを探して、同様の問題に遭遇したと思います。

オリジナルショット: Original

私はこれは私が

map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, d, np.eye(3), k, (800,600), cv2.CV_16SC2) 
nemImg = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) 

として得るものである、cv2.fisheye.calibrateとそれを校正Kを持って、Dは

K = [[ 329.75951163 0.   422.36510555] 
[ 0.   329.84897388 266.45855056] 
[ 0.   0.   1.  ]] 

D = [[ 0.04004325] 
[ 0.00112638] 
[ 0.01004722] 
[-0.00593285]] 

パラメータ私はそれがあまりにも多くチョップすると思います。私は

nk = k.copy() 
nk[0,0]=k[0,0]/2 
nk[1,1]=k[1,1]/2 
# Just by scaling the matrix coefficients! 

map1, map2 = cv2.fisheye.initUndistortRectifyMap(k, d, np.eye(3), nk, (800,600), cv2.CV_16SC2) # Pass k in 1st parameter, nk in 4th parameter 
nemImg = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) 

多田で固定し、全体ルービックキューブ

initUndistortRectifyMap/remap with the K,D

を見てみたいです!

This is what I want

関連する問題