OpenCV 距離計測 - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) ステレオマッチング(二眼カメラ)による距離計測

OpenCV CvCalibFilterも参照

OpenCVで使われているアルゴリズム

Depth Discontinuities by Pixel-to-Pixel Stereoが使われている。このサイトからサンプル画像も入手可能。

関数

cvFindStereoCorrespondenceを使う。キャリブレーション無しで使える。

但し、算出するのは画素の距離のみなので、ベースライン、焦点距離などのパラメータからの実空間距離は自身で算出する必要がある。

サンプルソース

左右の画像を読んで、原画像2枚と視差画像(算出値と正規化値)を表示し、正規化値の画像を保存する。

  #include <cv.h>
  #include <highgui.h>
  #include <cvaux.h>

  int main(void)
  {
    double max=0, min=0;
    //カラー画像でもグレーとして読み込む
    IplImage* leftImage = cvLoadImage("left.jpg",0);
    IplImage* rightImage = cvLoadImage("right.jpg",0);
    IplImage* depthImage = cvCreateImage(cvGetSize(rightImage), IPL_DEPTH_8U, 1);
    IplImage* depthImage2 = cvCreateImage(cvGetSize(rightImage), IPL_DEPTH_8U, 1);
    cvNamedWindow("Left",1);
    cvNamedWindow("Right",1);
    cvShowImage("Left",leftImage);
    cvShowImage("Right",rightImage);
    cvFindStereoCorrespondence( leftImage, rightImage, CV_DISPARITY_BIRCHFIELD, depthImage, 25, 10, 5, 10, 15, 20 );
    //大抵真っ暗な画像になる。実空間の距離算出はこっちの画像を使う。
    cvNamedWindow("Disparity",1);
    cvShowImage("Disparity",depthImage);
    //画像の正規化
    cvMinMaxLoc(depthImage, &min, &max);
    cvConvertScaleAbs(depthImage, depthImage2, 255.0/(max-min), (255.0/(max-min))*(-min));
    //正規化画像の表示、保存
    cvNamedWindow("Disparity2",1);
    cvShowImage("Disparity2",depthImage2);
    cvSaveImage("disparity.jpg",depthImage2);

    cvWaitKey(0);

    cvDestroyWindow("Left");
    cvDestroyWindow("Right");
    cvDestroyWindow("Disparity");
    cvDestroyWindow("Disparity2");
    cvReleaseImage(&leftImage);
    cvReleaseImage(&rightImage);
    cvReleaseImage(&depthImage);
    cvReleaseImage(&depthImage2);
    return 0;
  }

処理結果

Depth Discontinuities by Pixel-to-Pixel Stereoからmeter1.jpg(左)、meter2.jpg(右)を拝借。

視差画像(正規化済み)、maxDisparity=50としてパラメータは10, 5, 10, 20, 25とした。 パラメータの調節はちゃんと論文を読んだ方が良さそうだ。

結果の可視化

VTKを使うのが楽。

距離画像の可視化を参照。

⚠️ **GitHub.com Fallback** ⚠️