OpenCV - imshow()在等待命令窗口输入时没有响应

时间:2015-07-24 19:39:47

标签: c++ opencv

我有一个程序设置图像,通过用户输入使用鼠标记录测量结果。在使用imshow()显示图像后,我询问用户是否要裁剪。在等待命令窗口的输入时,namedWindow没有响应,如果用户在指定是否裁剪之前单击窗口,则窗口将其作为第一个用于裁剪的点。

有没有办法让命令窗口和namedWindow一致工作?

测量类的构造函数:

MeasurementClass::MeasurmentClass(){

SetWorkingDirectory();
std::cout << "Before continuing, make sure image files are located in:\n\n  "
          << "\"" + WorkingDirectory + "\"\n"
          << std::endl;

setfilename:
SetFileName();            //uncomment after debug
SetDate();
Image = cv::imread(XrayFileName, CV_LOAD_IMAGE_COLOR);
FinalImage = Image.clone();
if(Image.empty()){
    std::cout << "Image failed to Load. Ensure correct image name and file location.\n"
              << std::endl;
    goto setfilename;
}
GetDesktopResolution();
ResizeImageForDisplay();

FinalDisplayImage = DisplayImage.clone();
cv::namedWindow(WindowName, cv::WINDOW_AUTOSIZE);
cv::imshow(WindowName, DisplayImage);
cv::waitKey(10);

PromptForCrop();
     

}

PromptFor Crop()

void MeasurementClass::PromptForCrop(void){
    std::cout << "Would you like to crop image? (y/n):  ";

    std::string strCrop;
    std::getline(std::cin, strCrop);
    std::cout << std::endl;
    char Crop = strCrop[0];

    switch(Crop){
        case 'y':
        case '\0':
            CropImage();
        default:
            break;
    }

}

加成

最近我注意到 goto 语句是一种可怕的做法。在这种情况下,什么是 goto 语句的一个很好的替代方案。

1 个答案:

答案 0 :(得分:0)

您可以使用cv :: waitKey()返回值来获取用户输入。为了做到这一点,请给图像窗口焦点,而不是命令窗口,否则它将无法捕获您的密钥:

char c = 'q';
cv::Mat image = cv::imread( "C:/local/opencv30/sources/samples/data/lena.jpg" );

cv::imshow( "image", image );

do
{
    c = cv::waitKey();
}
while ( c != 'y' && c != 'n' );

if ( c == 'y' )
    cout << "yes" << endl;
else if ( c == 'n' )
    cout << "no" << endl;