From 6d1f7c2b1b5de024083ca1c3cf515e9d48cd9fb4 Mon Sep 17 00:00:00 2001
From: Pierre-Emmanuel Viel
Date: Tue, 18 Aug 2020 16:10:56 +0200
Subject: [PATCH] Update the stereo sample: * add the HH4 mode * option to
display disparity with a color map * display current settings in the title
bar * don't close app when wanting to take screenshots
---
samples/cpp/stereo_match.cpp | 65 +++++++++++++++++++++++++-----------
1 file changed, 46 insertions(+), 19 deletions(-)
diff --git a/samples/cpp/stereo_match.cpp b/samples/cpp/stereo_match.cpp
index 0cfaba6f70..55cd89c26e 100644
--- a/samples/cpp/stereo_match.cpp
+++ b/samples/cpp/stereo_match.cpp
@@ -14,15 +14,16 @@
#include "opencv2/core/utility.hpp"
#include
+#include
using namespace cv;
static void print_help(char** argv)
{
printf("\nDemo stereo matching converting L and R images into disparity and point clouds\n");
- printf("\nUsage: %s [--algorithm=bm|sgbm|hh|sgbm3way] [--blocksize=]\n"
+ printf("\nUsage: %s [--algorithm=bm|sgbm|hh|hh4|sgbm3way] [--blocksize=]\n"
"[--max-disparity=] [--scale=scale_factor>] [-i=] [-e=]\n"
- "[--no-display] [-o=] [-p=]\n", argv[0]);
+ "[--no-display] [--color] [-o=] [-p=]\n", argv[0]);
}
static void saveXYZ(const char* filename, const Mat& mat)
@@ -50,16 +51,17 @@ int main(int argc, char** argv)
std::string disparity_filename = "";
std::string point_cloud_filename = "";
- enum { STEREO_BM=0, STEREO_SGBM=1, STEREO_HH=2, STEREO_VAR=3, STEREO_3WAY=4 };
+ enum { STEREO_BM=0, STEREO_SGBM=1, STEREO_HH=2, STEREO_VAR=3, STEREO_3WAY=4, STEREO_HH4=5 };
int alg = STEREO_SGBM;
int SADWindowSize, numberOfDisparities;
bool no_display;
+ bool color_display;
float scale;
Ptr bm = StereoBM::create(16,9);
Ptr sgbm = StereoSGBM::create(0,16,3);
cv::CommandLineParser parser(argc, argv,
- "{@arg1||}{@arg2||}{help h||}{algorithm||}{max-disparity|0|}{blocksize|0|}{no-display||}{scale|1|}{i||}{e||}{o||}{p||}");
+ "{@arg1||}{@arg2||}{help h||}{algorithm||}{max-disparity|0|}{blocksize|0|}{no-display||}{color||}{scale|1|}{i||}{e||}{o||}{p||}");
if(parser.has("help"))
{
print_help(argv);
@@ -74,12 +76,14 @@ int main(int argc, char** argv)
_alg == "sgbm" ? STEREO_SGBM :
_alg == "hh" ? STEREO_HH :
_alg == "var" ? STEREO_VAR :
+ _alg == "hh4" ? STEREO_HH4 :
_alg == "sgbm3way" ? STEREO_3WAY : -1;
}
numberOfDisparities = parser.get("max-disparity");
SADWindowSize = parser.get("blocksize");
scale = parser.get("scale");
no_display = parser.has("no-display");
+ color_display = parser.has("color");
if( parser.has("i") )
intrinsic_filename = parser.get("i");
if( parser.has("e") )
@@ -238,6 +242,8 @@ int main(int argc, char** argv)
sgbm->setMode(StereoSGBM::MODE_HH);
else if(alg==STEREO_SGBM)
sgbm->setMode(StereoSGBM::MODE_SGBM);
+ else if(alg==STEREO_HH4)
+ sgbm->setMode(StereoSGBM::MODE_HH4);
else if(alg==STEREO_3WAY)
sgbm->setMode(StereoSGBM::MODE_SGBM_3WAY);
@@ -254,7 +260,7 @@ int main(int argc, char** argv)
if (disp.type() == CV_16S)
disparity_multiplier = 16.0f;
}
- else if( alg == STEREO_SGBM || alg == STEREO_HH || alg == STEREO_3WAY )
+ else if( alg == STEREO_SGBM || alg == STEREO_HH || alg == STEREO_HH4 || alg == STEREO_3WAY )
{
sgbm->compute(img1, img2, disp);
if (disp.type() == CV_16S)
@@ -268,22 +274,13 @@ int main(int argc, char** argv)
disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.));
else
disp.convertTo(disp8, CV_8U);
- if( !no_display )
- {
- namedWindow("left", 1);
- imshow("left", img1);
- namedWindow("right", 1);
- imshow("right", img2);
- namedWindow("disparity", 0);
- imshow("disparity", disp8);
- printf("press any key to continue...");
- fflush(stdout);
- waitKey();
- printf("\n");
- }
+
+ Mat disp8_3c;
+ if (color_display)
+ cv::applyColorMap(disp8, disp8_3c, COLORMAP_TURBO);
if(!disparity_filename.empty())
- imwrite(disparity_filename, disp8);
+ imwrite(disparity_filename, color_display ? disp8_3c : disp8);
if(!point_cloud_filename.empty())
{
@@ -297,5 +294,35 @@ int main(int argc, char** argv)
printf("\n");
}
+ if( !no_display )
+ {
+ std::ostringstream oss;
+ oss << "disparity " << (alg==STEREO_BM ? "bm" :
+ alg==STEREO_SGBM ? "sgbm" :
+ alg==STEREO_HH ? "hh" :
+ alg==STEREO_VAR ? "var" :
+ alg==STEREO_HH4 ? "hh4" :
+ alg==STEREO_3WAY ? "sgbm3way" : "");
+ oss << " blocksize:" << (alg==STEREO_BM ? SADWindowSize : sgbmWinSize);
+ oss << " max-disparity:" << numberOfDisparities;
+ std::string disp_name = oss.str();
+
+ namedWindow("left", cv::WINDOW_NORMAL);
+ imshow("left", img1);
+ namedWindow("right", cv::WINDOW_NORMAL);
+ imshow("right", img2);
+ namedWindow(disp_name, cv::WINDOW_AUTOSIZE);
+ imshow(disp_name, color_display ? disp8_3c : disp8);
+
+ printf("press ESC key or CTRL+C to close...");
+ fflush(stdout);
+ printf("\n");
+ while(1)
+ {
+ if(waitKey() == 27) //ESC (prevents closing on actions like taking screenshots)
+ break;
+ }
+ }
+
return 0;
}
--
GitLab