OpenCV両目マッチングアルゴリズム
2252 ワード
OpenCVでは,BM,SGBM,HHなどの複数の両目マッチングアルゴリズムを提供し,各アルゴリズムの主要パラメータの設定と取得方式を提供し,両目マッチングのアルゴリズム開発を加速させた.両目マッチングは、カメラが左右のカメラの内外パラメータを標定する-->左右の画像を歪み補正する-->マッチングアルゴリズムを選択して補正後の画像をマッチングし、視差を計算する流れに従う.各マッチングアルゴリズムも一定の流れに従い、具体的な詳細は後でマッチングアルゴリズムの剖析で説明する.
カメラ標定:
カメラ標定はよく使われる碁盤格標定法で、ネット上で提供されるツールはたくさんあります.よく使われるのはOpenCVまたはMATLABが提供する標定ツールです.具体的なウェブサイトは以下の通りです.
http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration
http://www.vision.caltech.edu/bouguetj/calib_doc/
カメラの標定の後に2つのファイルがあって、それぞれ内パラメトリックマトリクスと外パラメトリックマトリクスに対応して、OpenCVの中の2つのファイルはymlフォーマットで、内パラメトリックファイルintrinsics.ymlではM 1,M 2がカメラ内焦点距離(fx,fy),光心(cx,cy),D 1,D 2がカメラ歪み(k 1,k 2,p 1,p 2[,k 3[,k 4,k 5,k 6[,s 1,s 2,s 3,s 4[,τx,τy]]]])には、4,5,8,12または14の要素があります.
左右画像歪み補正:
OpenCVでは、画像補正の関数が提供され、以下のように動作します.
stereoRectifyとinitUndistortRectifyMapについては、次の説明を参照してください.
https://blog.csdn.net/u013341645/article/details/78710740
https://docs.opencv.org
画像の一致:
ここでは必要に応じて異なるマッチングアルゴリズムを選択することができ、OpenCVでのマッチングアルゴリズムの呼び出し方式は同じであり、いずれもsetParamとgetParamによってアルゴリズムパラメータ値を設定して取得し、computeによってアルゴリズムを実行し、計算して視差マップを得る.以下はBMを例に展開する.
カメラ標定:
カメラ標定はよく使われる碁盤格標定法で、ネット上で提供されるツールはたくさんあります.よく使われるのはOpenCVまたはMATLABが提供する標定ツールです.具体的なウェブサイトは以下の通りです.
http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration
http://www.vision.caltech.edu/bouguetj/calib_doc/
カメラの標定の後に2つのファイルがあって、それぞれ内パラメトリックマトリクスと外パラメトリックマトリクスに対応して、OpenCVの中の2つのファイルはymlフォーマットで、内パラメトリックファイルintrinsics.ymlではM 1,M 2がカメラ内焦点距離(fx,fy),光心(cx,cy),D 1,D 2がカメラ歪み(k 1,k 2,p 1,p 2[,k 3[,k 4,k 5,k 6[,s 1,s 2,s 3,s 4[,τx,τy]]]])には、4,5,8,12または14の要素があります.
左右画像歪み補正:
OpenCVでは、画像補正の関数が提供され、以下のように動作します.
stereoRectify( M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY, -1, img_size, &roi1, &roi2 );
Mat map11, map12, map21, map22;
// R1,P1 StereoRectify,
initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12);
initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22);
Mat img1r, img2r;
remap(img1, img1r, map11, map12, INTER_LINEAR);//img1
remap(img2, img2r, map21, map22, INTER_LINEAR);
stereoRectifyとinitUndistortRectifyMapについては、次の説明を参照してください.
https://blog.csdn.net/u013341645/article/details/78710740
https://docs.opencv.org
画像の一致:
ここでは必要に応じて異なるマッチングアルゴリズムを選択することができ、OpenCVでのマッチングアルゴリズムの呼び出し方式は同じであり、いずれもsetParamとgetParamによってアルゴリズムパラメータ値を設定して取得し、computeによってアルゴリズムを実行し、計算して視差マップを得る.以下はBMを例に展開する.
//set bm's params
bm->setROI1(roi1);
bm->setROI2(roi2);
bm->setPreFilterCap(PrefilterSize);
bm->setPreFilterCap(PrefilterCap);
bm->setBlockSize(SADWindowSize > 0 ? SADWindowSize : 9);
bm->setMinDisparity(0);
bm->setNumDisparities(numberOfDisparities);
bm->setTextureThreshold(TextureThreshold);
bm->setUniquenessRatio(UniquenessRatio);
bm->setSpeckleWindowSize(SpeckleWindowSize);
bm->setSpeckleRange(SpeckleRange);
bm->setDisp12MaxDiff(Disp12MaxDiff);
bm->compute(img1, img2, disp);
disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.));