2016-09-11 132 views
1

チュートリアルの後にカメラを較正しています。私はチェス盤を使ってカメラの固有のパラメータと歪み係数を見つける全プロセスを理解しています。私が理解できないことは、それ以後、なぜgetOptimalNewCameraMatrixと呼ぶのですか?特にalphaパラメータの場合。すでにドキュメントを読んでいますが、カメラのキャリブレーションに関する知識が不足しているため、わかりません。OpenCVでgetOptimalNewCameraMatrixは何をしていますか?

これは元の画像です。 Original image

以下は、上記画像の歪みのない画像のサンプルです(OpenCVのundistortを使用)。

これは、取得した固有カメラと歪み係数を使用して直接画像を歪ませます。私はそれをundistort前 Directly undistorted image

は、このいずれかのように、私は(右)(左)alpha=0alpha=1getOptimalNewCameraMatrixを呼び出します。 Distorted image with alpha

私には分かりますが、getOptimalNewCameraMatrixは情報を失うことなく元の画像を保存していますか?私は誰かがこの機能が本当に何を解釈できることを願っています。

このカメラの画像でStructure from Motion(SfM)を使用して3Dモデルを構築する場合は、最初にgetOptimalNewCameraMatrixを呼び出す必要がありますか?

ありがとうございました。

答えて

1

元の画像と同じ形状の画像を使用するには、いくつかのピクセルを失う必要があります。 OpenCVのドキュメントから「アルファ」パラメータ記述が状態

...

フリースケーリングパラメータ0の間( 歪みのない画像内のすべてのピクセルが有効である場合)と1(すべてのソース画像ピクセル は、歪みのない画像内に保持されている)

私にはこれが0の値で、全ての画素が幾何学的に含まれるように変換されますことを意味します。ラジアル方向と接線方向の歪みは除去されますが、画像は幾何学的に正しいとは限りません。

getOptimalNewCameraMatrixは、同じ較正で同じカメラから異なる解像度を使用するために使用されます。

私はgetOptimalNewCameraMatrixを使用したときに最良の結果を得て、次に返される関心領域の作物を適用します。

ここに私がこの目的のために使用するPythonのスニペットがあります。

newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h)) 
mapx, mapy = cv2.initUndistortRectifyMap(mtx, dist, None, newcameramtx, dim, 5) 
image = cv2.remap(image, mapx, mapy, cv2.INTER_LINEAR) 

x, y, w, h = roi 
image = image[y:y + h, x:x + w] 

最後の画像(ピンのクッションは右側にあります)を使用して、最も使用可能な画像を表示する必要があります。彼らは同じ解像度

あることは

あなただけの新しい画像にremapを呼び出す保つことができるように私もその2つの部分にundistort方法を分割カメラから受信しました

関連する問題