私は最近、Matlab Single Camera Calibration Appアルゴリズムを使用して、カメラの組み込み関数と外部関数を調整しています。チェス盤の隅を見つけると、多くのdetectCheckerboardPoints
場合、Matlab の関数が opencv api を (正確に) 実行しますがcv::findChessboardCorners
、一部の写真では、Matlab が奇妙な動作をします。
たとえば、次の画像では、ボードの正方形の間の角がはっきりと見えますが、matlab は奇妙な場所で冗長なものを見つけます。
matlab コード スニペットは以下のように単純です。
img=imread(fn);
[imUndist, newOrig]=undistortImage(img, cameraParams);
[pxs, bdsize]=detectCheckerboardPoints(imUndist); %or detect on 'img' directly
imMarked=insertMarker(imUndist, pxs);
imshow(imMarked);
opencv
この画像で(以下のコード)で検出されたコーナーは非常に正確です:
//opencv コード:
Mat img = imread(fpath);
int ww = 8, hh = 15;
cv::Size bsz(ww, hh);
vector<Point2f> ptvec;
bool found = cv::findChessboardCorners(img, bsz, ptvec, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE);
cv::drawChessboardCorners(img, bsz, ptvec, found);
imshow("img", img);
waitKey();