OpenCV_ undistortPoints( ) の結果がおかしい

1000 や 100 の座標なのにマイナスや 0. XXX になってしまった。

結論から。

第 6 引数 ( カメラ行列 ) を指定する。
第 5 引数 ( 平行化変換 ) は指定しなくとも 出力結果見た範囲では 問題なかった。

※何故だかわからん。

 

緑字以外、値は格納済み。
std::vecto r<cv::Point2f> srcPoints
std::vecto r<cv::Point2f> dstPoints
cv::Mat cameraM
cv::Mat dist
cv::Mat P

 

cv::undistortPoints ( srcPoints, dstPoints, cameraM, dist, P = cameraM );

で実行したら補正された良い感じの値が格納された。
↓ dstPoints に格納された値。

1264.983398    1472.746582
1499.207764    1533.925049
1318.042969    2195.557373

 

cv::Mat R;
cv::undistortPoints ( srcPoints, dstPoints, cameraM, dist, R, P = cameraM );

でやっても良い感じの値が dstPoints に格納。

 

 

cv::undistortPoints ( srcPoints, dstPoints, cameraM, dist );

 で実行すると NG
↓ dstPoints に格納された値。

-0.358665    -0.065832
0.354712    -0.475975
0.369053    -0.407884

 

undistortPoints の引数

undistortPoints( ) は undistort( ) や  initUndistortRectifyMap( ) と同様の関数。

undistort ( ) は画像に対してレンズ歪みを補正する関数だが、
undistortPoints( ) は座標に対して、レンズ歪みを補正。

 

引数

 第 1 引数:補正前の座標
第 2 引数:補正された出力座標
第 3 引数:カメラ行列
第 4 引数:歪み係数ベクトル
第 5 引数:平行化変換 ( 3 × 3 の行列)
第 6 引数:新たなカメラ行列

ドキュメントより、
第 2 引数 以外 InputArray とあるので、用意しておく行列5 、 6 は分からない。
第 2 引数OputputArray

 

 

こちらから。
undistortPoints in OpenCV (cv2) with Python wrong results - Stack Overflow
https://qiita.com/jellied_unagi/items/36796d48d7d8a5fb3e42
https://docs.opencv.org/3.3.1/da/d54/group__imgproc__transform.html#ga55c716492470bfe86b0ee9bf3a1f0f7e
http://opencv.jp/opencv-2svn/cpp/camera_calibration_and_3d_reconstruction.html#cv-undistortpoints

 

以上。