はじめに
本稿では、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表示すれば、目標達成です。
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」を解説しました。最後までお読みいただき、ありがとうございました。