OpenCVでステレオ画像処理(その4)
depthからxyz点群に変換する方法を確認しておきます。
画像を変換
void reprojectImageTo3D(const Mat& disparity, Mat& _3dImage, const Mat& Q, bool handleMissingValues=false)
ハズレ値を最遠点とするためにはhandleMissingValues=trueとします。
1点を変換
void perspectiveTransform(const Mat& src, Mat& 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関数を詳しく調べる -----