3D Program

How it’s done: Stereo 3D Cloud Display with Post-Filter.

はじめに

本稿では、Visual C++にて作成したプログラム「Stereo 3D Cloud Display with Post Filter」を解説します。このプログラムは、基本的に「Stereo 3D Cloud Display without Post-Filter」に Post-Filter 機能を追加したものとなります。以下の手順で解説致します。

  • Stereo 3D Cloud Display with Post-Filter Flow Chart
  • List of Flow Processes

それでは、参りましょう。

Stereo 3D Cloud Display with Post-Filter Flow Chart

先ず、プログラムに必要な関数を定義する部分(Declaration of parameters and input images)で、Post-Filter 実行に必要な関数も定義します。その後、Disparity Mapping のパートで Post-Filter をDisparity Mapping直後に実行します。Filter 後の結果を 3D表示すれば、目標達成です。

Stereo 3D Cloud Display with Post-Filter Flow Chart

List of Flow Processes

以下が Stereo 3D Cloud Display with Post-Filter の Flow Processとなります。

Declaration of parameters and input images:

このパートで「Stereo 3D Cloud Display without Post-Filter」から追加された項目は、Disparity Mapping の Parameter設定です。これらは Post-Filter の初期設定となります。その他の項目は変っていません。

////////////////////////////////////////////////////
//
// Declaration of parameters for disparity mapping with post-filter
//
String dst_path = "none"; // parser.get<String>("dst_path");
String dst_raw_path = "none"; // parser.get<String>("dst_raw_path");
String dst_conf_path = "none"; // parser.get<String>("dst_conf_path");
bool no_display = false; // = "no-display"; //parser.has("no-display");
bool no_downscale = false; // = "no-downscale"; // parser.has("no-downscale");
int max_disp = 80; // parser.get<int>("max_disparity");
double lambda = 8000.0; // parser.get<double>("wls_lambda");
double sigma = 1.5; // parser.get<double>("wls_sigma");
double vis_mult = 1.0; // parser.get<double>("vis_mult");
int wsize;
wsize = 1;
//
////////////////////////////////////////////////////

Reading camera parameters from calibration data files:

このパートは「Stereo 3D Cloud Display without Post-Filter」と変わりありません。

Transformation and rectification image maps:

このパートは「Stereo 3D Cloud Display without Post-Filter」と変わりありません。

Prepare camera images to process disparity mapping:

このパートは「Stereo 3D Cloud Display without Post-Filter」と変わりありません。

Disparity mapping:

このパートでは「Stereo 3D Cloud Display without Post-Filter」から大幅に変更しました。 Stereo Matching を行った後に Post-Filter を通して、3D画像を表示します。画像は比較のために、 Post-Filter 無しと有と表示します。これにより、Disparity Mapping が如何にノイズに敏感かをご覧頂けると思います。

////////////////////////////////////////////
//
// Stereo matching
//
// Declare StereoSGBM default setting
//
Ptr<StereoSGBM> left_matcher = StereoSGBM::create(0, max_disp, wsize, 1, 2, 0, 0, 0, false, 0, StereoSGBM::MODE_HH);
left_matcher->setP1(24 * wsize*wsize);
left_matcher->setP2(96 * wsize*wsize);
left_matcher->setPreFilterCap(63);
left_matcher->setMode(StereoSGBM::MODE_SGBM_3WAY);
wls_filter = createDisparityWLSFilter(left_matcher);
Ptr<StereoMatcher> right_matcher = createRightMatcher(left_matcher);
 
matching_time = (double)getTickCount();
left_matcher->compute(left_for_matcher, right_for_matcher, left_disp);
right_matcher->compute(right_for_matcher, left_for_matcher, right_disp);
matching_time = ((double)getTickCount() - matching_time) / getTickFrequency();

//
// Here's post-filtering section.
//
//! [filtering]
wls_filter->setLambda(lambda);
wls_filter->setSigmaColor(sigma);
filtering_time = (double)getTickCount();
wls_filter->filter(left_disp, left, filtered_disp, right_disp);
filtering_time = ((double)getTickCount() - filtering_time) / getTickFrequency();
//! [filtering]

conf_map = wls_filter->getConfidenceMap();
 
// Get the ROI that was used in the last filter call:
ROI = wls_filter->getROI();
if (!no_downscale)
{
// upscale raw disparity and ROI back for a proper comparison:
resize(left_disp, left_disp, Size(), 2.0, 2.0);
left_disp = left_disp*2.0;
ROI = Rect(ROI.x * 2, ROI.y * 2, ROI.width * 2, ROI.height * 2);
}
 
if (!no_display)
{
namedWindow("left", WINDOW_AUTOSIZE);
cv::imshow("left", left);
namedWindow("right", WINDOW_AUTOSIZE);
cv::imshow("right", right);
 
if (!noGT)
{
Mat GT_disp_vis;
getDisparityVis(GT_disp, GT_disp_vis, vis_mult);
namedWindow("ground-truth disparity", WINDOW_AUTOSIZE);
cv::imshow("ground-truth disparity", GT_disp_vis);
}
 
//
// Here shows the disparity mappings.
//
//! [visualization]
Mat raw_disp_vis;
getDisparityVis(left_disp, raw_disp_vis, vis_mult);
namedWindow("raw disparity", WINDOW_AUTOSIZE);
cv::imshow("raw disparity", raw_disp_vis);
Mat filtered_disp_vis;
getDisparityVis(filtered_disp, filtered_disp_vis, vis_mult);
namedWindow("filtered disparity", WINDOW_AUTOSIZE);
cv::imshow("filtered disparity", filtered_disp_vis);
cv::waitKey();
//! [visualization]
}

Converting camera parameters to “float” format:

このパートのメインの部分は「Stereo 3D Cloud Display without Post-Filter」と変わりありません。最後に一行だけ追加します。

//
// Declare disparity map
//
Mat disparity_map = filtered_disp;

Display 3D Point Cloud using OpenCV 3.0 Viz function.:

このパートは「Stereo 3D Cloud Display without Post-Filter」と変わりありません。

まとめ

如何でしたか。本稿ではVisual C++にて作成したプログラム「Stereo 3D Cloud Display with Post Filter」を解説しました。最後までお読みいただき、ありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です