VisualSfMの使い方 その3 -既知のカメラパラメータを用いた復元-
今回は、画像を撮影したカメラの内部パラメータが既知かつ全ての画像で同じ場合の復元について説明します。
Structure-from-motionでは、カメラの外部パラメータ(並進、回転)、カメラの内部パラメータ(焦点距離、画像中心、レンズ歪など)、特徴点の三次元位置を推定することが出来ます。VisualSfMもデフォルトではこれらのパラメータを推定するようになっています。
しかし、事前にカメラキャリブレーションを行ったカメラを用いて撮影した画像を用いる場合には、カメラの内部パラメータの推定は不要になります。VisualSfMでは、このような場合に事前のキャリブレーション結果を利用することが出来る機能が用意されています。
カメラパラメータは、SfM -> More Functions -> Set Fixed Calibrationを選択することで焦点距離 fx, fy [pixel]、画像中心 cx, cy、レンズ歪係数 rを指定することが出来ます。ただし、歪係数は1次の項のみなので、歪が大きな画像を入力する場合には、以下のように事前に歪を取り除いた画像を用意し、r=0を指定するのが良いかもしれません。
経験的には、既知の内部パラメータを用いた復元の方が、精度よく推定されているように思います。
Structure-from-motionでは、カメラの外部パラメータ(並進、回転)、カメラの内部パラメータ(焦点距離、画像中心、レンズ歪など)、特徴点の三次元位置を推定することが出来ます。VisualSfMもデフォルトではこれらのパラメータを推定するようになっています。
しかし、事前にカメラキャリブレーションを行ったカメラを用いて撮影した画像を用いる場合には、カメラの内部パラメータの推定は不要になります。VisualSfMでは、このような場合に事前のキャリブレーション結果を利用することが出来る機能が用意されています。
カメラパラメータは、SfM -> More Functions -> Set Fixed Calibrationを選択することで焦点距離 fx, fy [pixel]、画像中心 cx, cy、レンズ歪係数 rを指定することが出来ます。ただし、歪係数は1次の項のみなので、歪が大きな画像を入力する場合には、以下のように事前に歪を取り除いた画像を用意し、r=0を指定するのが良いかもしれません。
#include <opencv2/opencv.hpp>
int main(int argc, char** argv)
{
cv::Mat K;
cv::Mat distCoeffs;
//内部パラメータの読み込み
cv::FileStorage fs("camera.xml", CV_STORAGE_READ);
fs["intrinsicMat"] >> K;
fs["distCoeffs"] >> distCoeffs;
cv::Mat input = cv::imread("image1.jpg");
cv::Mat undistorted;
//レンズ歪の除去
cv::undistort(input, undistorted, K, distCoeffs);
//オリジナル画像
cv::namedWindow("Original");
cv::imshow("Original", input);
//レンズ歪除去後の画像
cv::namedWindow("undistorted");
cv::imshow("undistorted", undistorted);
cv::imwrite("undistorted.jpg", undistorted);
cv::waitKey();
return 0;
}
経験的には、既知の内部パラメータを用いた復元の方が、精度よく推定されているように思います。

コメント
コメントを投稿