我有一个程序设置图像,通过用户输入使用鼠标记录测量结果。在使用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 语句的一个很好的替代方案。
答案 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;