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 (マトリックスに変更なし) を使用すると、妥当な (ただしトリミングされた) 結果が得られます。
alpha = 1 を使用すると、すべての元のピクセルが新しい画像にマッピングされた画像が得られると思いますが、次のようになります。
だから、私の質問はこれです: 私は何を間違っているのですか? また、キャリブレーションからトリミングされていない歪みのない画像を取得できないのはなぜですか?
我慢してくれてありがとう、これはここでの最初の質問ですが、できるだけ完全になるように努めました. どういうわけか台無しになったら教えてください!