2012-10-16 4 views
6

私はOpenCVのカメラ較正スイートを使用して、魚眼カメラから画像を歪ませようとしています(関連があればGoProを使用しています)。私はプロセスのほとんどを動作させており、ひずみのないイメージを生成することができます。ただし、再マップを使用する場合、歪みのない画像は「有効な矩形」です。つまり、歪んでいないフレームに内在する湾曲した黒い枠線を避けるために、元の画像を切り取った画像が返されます。OpenCVによる単一のカメラ較正 - 「完全な」ひずみのない画像を生成する問題

私は非常に奇妙な結果で状況を修正するためにgetOptimalNewCameraMatrix()を使用しようとしました。あなたのうちの一人が私の問題を明らかにしてくれることを願っています。

次のように私は現在、カメラのキャリブレーション:

私は必要cameraMatrixを生成
double error = calibrateCamera(worldPoints, sensorPoints, process_size, cameraMatrix, distCoeffs, rvecs, tvecs, calibration_flags); 

。この部分は動作します(私は思う)。これをinitUndistortRectifyMap()とそれに続くremap()で実行すると、有効なイメージが返されるからです。しかし、私は完全な画像を探していますので、私は次のことは、次のように私のcameraMatrixを修正しようとしている:これは(

int alpha = 1; 
cameraMatrix_corr = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, image.size(), alpha); 

をその後、私は、リマップのためのXとYのマップを生成し、次のようにOpenCV 2.0 Cookbookから直接借りてきたので、私もかなり自信が持てます)。

initUndistortRectifyMap(
    cameraMatrix_corr, // computed camera matrix 
    distCoeffs, // computed distortion matrix 
    Mat(), // optional rectification (none) 
    Mat(), // camera matrix to generate undistorted 
    image.size(), // size of undistorted 
    CV_32FC1,  // type of output map 
    map1, map2); // the x and y mapping functions 

最後に、イメージを再マップします。

// Apply mapping functions 
remap(image, undistorted, map1, map2, INTER_LINEAR); 

ここまでは私の結果です。アルファ= 0(行列を変更しない)を使用すると、合理的な(結果は残っていますが)結果が得られます。私は私に新しいイメージにマッピングされたすべての元の画素を持つ画像を与えるべきだと思うのα= 1を、使用している場合は、私は次の取得

Image (alpha = 1)

Image(alpha = 0)

ので、私の質問はこれです:私は間違って何をしています、なぜ私はキャリブレーションから裁断されていない歪んでいない画像を得ることができないのですか?

私のことを考えてくれてありがとう、これは私の最初の質問ですが、私は可能な限り完全にしようとしました。私が何とかしゃがんでしまったかどうか教えてください!

答えて

4

カメラの行列を補正することは歪みがないかのようにカメラの行列を与えるので、ひずみをなくすために行うべきことではないと思います。

イメージ情報を「失う」ことを避けたいのであれば、マップをxとyにシフトしてイメージをより大きなイメージにマップすることが最善の方法です。これは、コーナーのピクセルを歪ませないときにイメージを整流するために外側に移動するためです。

魚眼レンズは歪みが大きく、正しいコードを使用しても完全には修正されないことに注意してください。

+1

私は、最適化関数によって与えられた関心領域が小さすぎる同様の問題を抱えていました。あなたの "カメラの行列を補正することはあなたが歪まないようにするべきではない"というアドバイスに基づいて、 'newcameramtx'パラメータを' dst = cv2.undistort(img、camera_matrix、dist_coefs、None、newcameramtx) 'に落としてみました。私のための問題。ありがとう! –

関連する問題