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

Posted

技术标签:

【中文标题】OpenCV - imshow()在等待来自命令窗口的输入时没有响应【英文标题】:OpenCV - imshow() not responding while waiting for input from command window 【发布时间】:2015-07-24 19:39:47 【问题描述】:

我有一个程序可以设置图像以通过用户使用鼠标输入来记录测量值。使用 imshow() 显示图像后,我询问用户是否要裁剪。在等待命令窗口的输入时,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 语句有什么好的替代方法。

【问题讨论】:

OpenCV 的命名窗口用于调试目的。如果你想做更复杂的 GUI,你最好使用 Qt 之类的东西。如果你坚持纯opencv,建议你看看这个示例代码:github.com/Itseez/opencv/blob/master/samples/cpp/ffilldemo.cpp 是的,不要使用goto。它们使代码难以阅读并且容易出错。在这里你可以使用类似的东西:do ... while(!Image.empty()) 【参考方案1】:

您可以使用 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;

【讨论】:

很好,但程序的其他部分使用命令窗口进行用户输入。我认为真正的解决方案是像 Qt 这样的真实用户界面,如 cmets 中所述。感谢您的意见。 是的,你是对的,我不推荐 highgui.lib 用于实际应用程序中的用户交互。

以上是关于OpenCV - imshow()在等待来自命令窗口的输入时没有响应的主要内容,如果未能解决你的问题,请参考以下文章

出现错误 - 在给出 imshow、imwrite 命令 opencv 时“找不到作家”

cv2.imshow命令在opencv-python中无法正常工作

无法使用 opencv imshow 查看彩色图像

使用imshow(OpenCV)显示图像时出现问题[重复]

opencv imshow()

在opencv中的imshow函数后插入延迟