2015-02-05 43 views
1

我有一个用C++编写的用opencv编写的应该计算视差图的程序。现在我想玩弄wihin while循环看起来像这样的价值观:用于增加值的cvWaitkey

while(true) { 

    cv::StereoSGBM disparity(minDISP,numDISP,SADWindowSize, disparitySmoothness1, disparitySmoothness2); 
    cv::Mat disparityMap, disparityNorm; 

    disparity(undistortedLeft[1], undistortedRight[1], disparityMap); 
    disparityMap*=(1/16.0); 
    cv::normalize(disparityMap, disparityNorm, 0,255, cv::NORM_MINMAX, CV_8U); 
    cv::imshow("disparityMap", disparityNorm); 
    key = cv::waitKey(0); 

    switch(char(key)) { 
    case 'n': numDISP+=16; 
    case 'm': minDISP+=1; 
    case 's': SADWindowSize+=2; 
    case 'q': break; 
    } 
} 

键被声明为char key;

我现在有问题如下。 如果我按n一切正常,如果我按m程序增加ns以及。如果我按s也是如此。如果我按q什么都没有发生。

我也试过使用if else语句,它是相同的结果。 这是因为key以任何方式保存之前按下的按钮吗?

也许有人可以帮助我。

+0

好吧,如果我使用这个没有任何工作了。事情是,我可以使用'std :: cout << key打印值; '显示确切的字符值(exec键,如esc或shift) – hGen 2015-02-05 14:55:08

+0

等待,你是否想按'q'键来打破你的while循环吗?因为它只会让你脱离switch语句。 – AndyG 2015-02-05 15:00:23

+0

在开关的情况下,它会继续下一个代码部分,直到找到一个“break”。所以你应该在'numDISP + = 16;''minDISP + = 1;''和'SADWindowSize + = 2;'之后添加一个'break';如果你不想在按下其中一个键时执行它们, break'只会让你跳出switch语句,而不是跳出循环!案例q中 – Micka 2015-02-05 15:07:25

回答

2

也许在switch-case的语法上有问题。每个案件结束时你是否故意留下陈述?

switch(char(key)) 
{ 
    case 'n': 
     numDISP+=16; 
     break; 
    case 'm': 
     minDISP+=1; 
     break; 
    case 's': 
     SADWindowSize+=2; 
     break; 
    case 'q': 
     // do nothing 
     break; 
    } 
+1

我想他想退出功能。 – GPPK 2015-02-05 15:06:16

0

在所有系统上,你不仅使用break语句,但也做这方面的工作:那我不使用waitKey(0),因为它给了0毫秒绘制

int key; 
key = waitKey() & 255; 

注意你的图片。在实践中,waitKey将需要时间来绘制它。