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 时“找不到作家”