【发布时间】: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())