OpenCV 距離計測 - eiichiromomma/CVMLAB GitHub Wiki
(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を使うのが楽。
距離画像の可視化を参照。