added more controls into gpu stereo sample
authorAlexey Spizhevoy <no@email>
Tue, 21 Dec 2010 08:26:48 +0000 (08:26 +0000)
committerAlexey Spizhevoy <no@email>
Tue, 21 Dec 2010 08:26:48 +0000 (08:26 +0000)
samples/gpu/stereo_match.cpp

index db28d9e..4ed5b38 100644 (file)
@@ -17,7 +17,17 @@ struct Params
 \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
@@ -28,6 +38,7 @@ struct App
     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
@@ -40,7 +51,7 @@ struct App
     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
@@ -80,6 +91,7 @@ int main(int argc, char** argv)
 \r
 Params::Params()\r
 {\r
+    method = BM;\r
     ndisp = 64;\r
 }\r
 \r
@@ -100,7 +112,6 @@ Params Params::read(int argc, char** argv)
             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
@@ -116,8 +127,12 @@ App::App(const Params& p)
     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
@@ -149,11 +164,8 @@ void App::run()
     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
@@ -177,6 +189,29 @@ void App::run()
 }\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
@@ -184,37 +219,99 @@ void App::handleKey(char key)
     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