6

OpenCVのカメラキャリブレーションスイートを使用して、魚眼カメラ(関連する場合はGoProを使用しています)から画像の歪みを取り除こうとしています。ほとんどのプロセスが機能しており、歪みのない画像を生成できます。ただし、リマップを使用する場合、歪みのない画像は「有効な長方形」です。つまり、返される画像は、歪みのないフレームに固有の湾曲した黒い境界線を避けるために、元の画像のトリミングされたバージョンです。

getOptimalNewCameraMatrix() を使用して状況を修正しようとしましたが、非常に奇妙な結果になりました。あなたの一人が私の問題に光を当てることができることを願っています。

現在、次のようにカメラを調整しています。

double error = calibrateCamera(worldPoints, sensorPoints, process_size, cameraMatrix, distCoeffs, rvecs, tvecs, calibration_flags);

これにより、必要な cameraMatrix が生成されます。initUndistortRectifyMap() に続いて remap() を実行すると、有効な画像が返されるため、この部分は機能します (と思います)。ただし、完全な画像を探しているので、次に行うことは、cameraMatrix を次のように修正することです。

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

次に、リマップ用の X マップと Y マップを次のように生成します (これは OpenCV 2.0 クックブックから直接借用したものなので、うまくいくと確信しています)。

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);

これが私のこれまでの結果です。alpha = 0 (マトリックスに変更なし) を使用すると、妥当な (ただしトリミングされた) 結果が得られます。

画像 (アルファ = 1)

alpha = 1 を使用すると、すべての元のピクセルが新しい画像にマッピングされた画像が得られると思いますが、次のようになります。

画像(アルファ=0)

だから、私の質問はこれです: 私は何を間違っているのですか? また、キャリブレーションからトリミングされていない歪みのない画像を取得できないのはなぜですか?

我慢してくれてありがとう、これはここでの最初の質問ですが、できるだけ完全になるように努めました. どういうわけか台無しになったら教えてください!

4

1 に答える 1

4

カメラ行列を修正することは、歪みがないかのようにカメラ行列が得られるため、歪みを解消するために行うべきことではないと思います。

画像情報を「失いたくない」場合は、マップを x と y でシフトし、画像をより大きな画像にマップするのがおそらく最善です。これは、歪みを元に戻すと、コーナーのピクセルが外側に移動して画像が修正されるためです。

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

于 2012-11-28T09:58:28.390 に答える