\r
string left;\r
string right;\r
- string method_str;\r
+\r
+ string method_str() const\r
+ {\r
+ switch (method)\r
+ {\r
+ case BM: return "BM";\r
+ case BP: return "BP";\r
+ case CSBP: return "CSBP";\r
+ }\r
+ return "";\r
+ }\r
enum {BM, BP, CSBP} method;\r
int ndisp; // Max disparity + 1\r
};\r
App(const Params& p);\r
void run();\r
void handleKey(char key);\r
+ void printParams() const;\r
\r
void workBegin() { work_begin = getTickCount(); }\r
void workEnd() \r
string text() const\r
{\r
stringstream ss;\r
- ss << "(" << p.method_str << ") FPS: " << setiosflags(ios::left) << setprecision(4) << work_fps;\r
+ ss << "(" << p.method_str() << ") FPS: " << setiosflags(ios::left) << setprecision(4) << work_fps;\r
return ss.str();\r
}\r
private:\r
\r
Params::Params()\r
{\r
+ method = BM;\r
ndisp = 64;\r
}\r
\r
else if (val == "BP") p.method = BP;\r
else if (val == "CSBP") p.method = CSBP;\r
else throw runtime_error("unknown stereo match method: " + val);\r
- p.method_str = val;\r
}\r
else if (key == "-ndisp") p.ndisp = atoi(val.c_str());\r
else throw runtime_error("unknown key: " + key);\r
cout << "stereo_match_gpu sample\n";\r
cout << "\nControls:\n"\r
<< "\tesc - exit\n"\r
+ << "\tp - print current parameters\n"\r
<< "\tm - change stereo match method\n"\r
- << "\t1/q - increase/decrease max disprity\n";\r
+ << "\t1/q - increase/decrease maximum disparity\n"\r
+ << "\t2/w - increase/decrease window size (for BM only)\n"\r
+ << "\t3/e - increase/decrease iteration count (for BP and CSBP only)\n"\r
+ << "\t4/r - increase/decrease level count (for BP and CSBP only)\n";\r
}\r
\r
\r
Mat disp(left.size(), CV_8U);\r
gpu::GpuMat d_disp(left.size(), CV_8U);\r
\r
- // Show initial parameters\r
- cout << "\nInitial Params:\n"\r
- << "\timage_size: (" << left.cols << ", " << left.rows << ")\n"\r
- << "\tmethod: " << p.method_str << endl\r
- << "\tndisp: " << p.ndisp << endl << endl;\r
+ cout << "\nimage_size: (" << left.cols << ", " << left.rows << ")\n";\r
+ printParams();\r
\r
running = true;\r
while (running)\r
}\r
\r
\r
+void App::printParams() const\r
+{\r
+ cout << "--- Parameters ---\n";\r
+ cout << "method: " << p.method_str() << endl\r
+ << "ndisp: " << p.ndisp << endl;\r
+ switch (p.method)\r
+ {\r
+ case Params::BM:\r
+ cout << "win_size: " << bm.winSize << endl;\r
+ break;\r
+ case Params::BP:\r
+ cout << "iter_count: " << bp.iters << endl;\r
+ cout << "level_count: " << bp.levels << endl;\r
+ break;\r
+ case Params::CSBP:\r
+ cout << "iter_count: " << csbp.iters << endl;\r
+ cout << "level_count: " << csbp.levels << endl;\r
+ break;\r
+ }\r
+ cout << endl;\r
+}\r
+\r
+\r
void App::handleKey(char key)\r
{\r
switch (key)\r
case 27:\r
running = false;\r
break;\r
+ case 'p': case 'P':\r
+ printParams();\r
+ break;\r
case 'm': case 'M':\r
switch (p.method)\r
{\r
case Params::BM:\r
p.method = Params::BP;\r
- p.method_str = "BP";\r
break;\r
case Params::BP:\r
p.method = Params::CSBP;\r
- p.method_str = "CSBP";\r
break;\r
case Params::CSBP:\r
p.method = Params::BM;\r
- p.method_str = "BM";\r
break;\r
}\r
- cout << "method: " << p.method_str << endl;\r
+ cout << "method: " << p.method_str() << endl;\r
break;\r
case '1':\r
p.ndisp = p.ndisp == 1 ? 8 : p.ndisp + 8;\r
+ cout << "ndisp: " << p.ndisp << endl;\r
bm.ndisp = p.ndisp;\r
bp.ndisp = p.ndisp;\r
csbp.ndisp = p.ndisp;\r
- cout << "ndisp: " << p.ndisp << endl;\r
break;\r
case 'q': case 'Q':\r
p.ndisp = max(p.ndisp - 8, 1);\r
+ cout << "ndisp: " << p.ndisp << endl;\r
bm.ndisp = p.ndisp;\r
bp.ndisp = p.ndisp;\r
csbp.ndisp = p.ndisp;\r
- cout << "ndisp: " << p.ndisp << endl;\r
+ break;\r
+ case '2':\r
+ if (p.method == Params::BM)\r
+ {\r
+ bm.winSize += 1;\r
+ cout << "win_size: " << bm.winSize << endl;\r
+ }\r
+ break;\r
+ case 'w': case 'W':\r
+ if (p.method == Params::BM)\r
+ {\r
+ bm.winSize = max(bm.winSize - 1, 2);\r
+ cout << "win_size: " << bm.winSize << endl;\r
+ }\r
+ break;\r
+ case '3':\r
+ if (p.method == Params::BP)\r
+ {\r
+ bp.iters += 1;\r
+ cout << "iter_count: " << bp.iters << endl;\r
+ }\r
+ else if (p.method == Params::CSBP)\r
+ {\r
+ csbp.iters += 1;\r
+ cout << "iter_count: " << csbp.iters << endl;\r
+ }\r
+ break;\r
+ case 'e': case 'E':\r
+ if (p.method == Params::BP)\r
+ {\r
+ bp.iters = max(bp.iters - 1, 1);\r
+ cout << "iter_count: " << bp.iters << endl;\r
+ }\r
+ else if (p.method == Params::CSBP)\r
+ {\r
+ csbp.iters = max(csbp.iters - 1, 1);\r
+ cout << "iter_count: " << csbp.iters << endl;\r
+ }\r
+ break;\r
+ case '4':\r
+ if (p.method == Params::BP)\r
+ {\r
+ bp.levels += 1;\r
+ cout << "level_count: " << bp.levels << endl;\r
+ }\r
+ else if (p.method == Params::CSBP)\r
+ {\r
+ csbp.levels += 1;\r
+ cout << "level_count: " << csbp.levels << endl;\r
+ }\r
+ break;\r
+ case 'r': case 'R':\r
+ if (p.method == Params::BP)\r
+ {\r
+ bp.levels = max(bp.levels - 1, 1);\r
+ cout << "level_count: " << bp.levels << endl;\r
+ }\r
+ else if (p.method == Params::CSBP)\r
+ {\r
+ csbp.levels = max(csbp.levels - 1, 1);\r
+ cout << "level_count: " << csbp.levels << endl;\r
+ }\r
break;\r
}\r
}\r