https://bitbucket.org/asama-yaya/opencv_cameracali...
クリックor'c'で撮影。
'q'で内部パラメータ計算する。
サブピクセル推定で、コーナーの検出精度を向上することができるが、
探索近傍サイズは大きすぎても小さすぎても駄目。
二値化は多分大津だが、うまくいかないならモルフォロジー演算をかますのもあり。
クリックor'c'で撮影。
'q'で内部パラメータ計算する。
サブピクセル推定で、コーナーの検出精度を向上することができるが、
探索近傍サイズは大きすぎても小さすぎても駄目。
二値化は多分大津だが、うまくいかないならモルフォロジー演算をかますのもあり。
- loop内で
cv::undistort(image, dist1, intrinsic, distortion, new_intrinsic);
これだけ。
しかし、毎回計算が入るので、後述のものを使うのが良いと思う。
ちなみにnew_intrinsicを入れると、こっちの内部パラメータで撮影した歪のない画像を作ってくれる。
これも後述。
- initialization内で
cv::Mat MapX, MapY; cv::Mat mapR = cv::Mat::eye(3, 3, CV_64F); cv::Mat new_intrinsic = cv::getOptimalNewCameraMatrix(intrinsic, distortion, image.size(), 1); cv::initUndistortRectifyMap(intrinsic, distortion, mapR, new_intrinsic, image.size(), CV_32FC1, MapX, MapY);
- loop内で
cv::remap(image, dist2, MapX, MapY, cv::INTER_LINEAR);
画素対応を直接求めておくというもの。
あらかじめ計算してくれるので、上述と比べて早い。
MapX,MapYには画素対応が入ってる。
GLSLにぶっこめば、歪補正がシェーダーでできる。
getOptimalNewCameraMatrixで、所望の画像サイズの内部パラメータを作ってくれる。
この結果を使えば、「new_intrinsicを持つ歪のないカメラ」で撮影したような画像を作れるわけです。
画像処理をするなら内部パラメータは大事になることが多いので、
この辺の変化はしっかり理解しとかないと危ない。
それと、getOptimalNewCameraMatrixの最後の引数を1にするか0にするかで結果が違う。
(左:入力、右:結果)
- 0


- 1


コメントをかく