cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

OpenCVでステレオ画像処理(その4)

depthからxyz点群に変換する方法を確認しておきます。

 

画像を変換

void reprojectImageTo3D(const Mat& disparityMat& _3dImage, const Mat& Q, bool handleMissingValues=false)

ハズレ値を最遠点とするためにはhandleMissingValues=trueとします。

 

1点を変換

void perspectiveTransform(const Mat& srcMat& dst, const Mat& mtx)

ここに与えるmtxはreprojectImageTo3DのQと同じです。

 

[1]の使用例では,Mat::reshape関数を使って、3チャネルの画像に置き換えています。

Mat xyz= depth.reshape(3,depth.size().area());

 

[2]でも述べられていますが、視差を3次元再投影するときDisparityを1/16倍(もしくは結果を16倍)してやる必要があります。注意深くサンプルのソースコードを読むと、

if( alg != STEREO_VAR )
disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.));

なんていう処理をしているところがあったりしますので、勘が良いと気が付きます。

 

[1]http://opencv.jp/opencv2-x-samples/point-cloud-rendering

[2]http://www.slideshare.net/ytanno/ss-21302350

[3] OpenCVとVisual C++による画像処理と認識(24)----- reprojectImageTo3D関数を詳しく調べる -----