OpenCV: как заставить окно изображения появляться поверх других окон?
С помощью cvShowImage
, можно легко показать изображение в OpenCV. Однако, как вы говорите OpenCV, чтобы показать окно поверх каждого другого окна?
Я запускаю полноэкранное приложение OpenGL, показывая изображения. В первый раз окно OpenCV появляется поверх окна моего приложения, но если я нажму на окно моего приложения (т. е. верну ему фокус), то мне не удастся вернуть OpenCV поверх окна OpenGL, даже при уничтожении и воссоздании окно.
Я думал о переименовании окно каждый раз, но есть ли другой способ сделать это?
4 ответов
OpenCV не имеет собственного способа сделать это (это я знаю).
ответ зависит от платформы. Если ваша цель-Windows, проверьте ответ а то этой и этой наверняка будет полезно.
Если вы находитесь в Linux, вам нужно взглянуть на то, как был скомпилирован OpenCV и проверить, на какой системе он построен (возможно, GTK+ 2.икс.) Тогда займитесь своими исследованиями.
ОК, я понял это для OSX и Windows. Вам просто нужно создать полноэкранное окно и показать его в течение очень короткого времени, тогда ваше следующее окно из OpenCV будет впереди. Итак, сначала откройте полноэкранное окно:
cv::namedWindow("GetFocus", CV_WINDOW_NORMAL);
cv::Mat img = cv::Mat::zeros(100, 100, CV_8UC3);
cv::imshow("GetFocus", img);
cv::setWindowProperty("GetFocus", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
waitKey(1);
cv::setWindowProperty("GetFocus", CV_WND_PROP_FULLSCREEN, CV_WINDOW_NORMAL);
destroyWindow("GetFocus");
и затем вы можете открыть окно anther, которое фактически показывает изображение:
Mat your_image = ...;
cv::namedWindow("ShowImg");
cv::imshow("ShowImg", your_image);
это работает для меня.
на MAC-OSX (El Capitan) OpenCV 3.1.0 вызов moveWindow, кажется, приносит окно, только что перемещенное наверх.
моим решением для OSX было изменить мой код OpenCV (версия 2.4.8), в частности файл windows_cocoa.mm в каталоге highgui/src.
Если вы хотите просто вывести новое окно вперед, не делая его активным, добавьте следующую строку непосредственно перед окончанием функции cvNamedWindow () в windows_cocoa.мм:
[window orderFrontRegardless];
чтобы заставить новое окно всегда быть активным, добавьте следующую строку:
[application activateIgnoringOtherApps:YES];
Это, вероятно, не лучшая идея для всех окон, но работает в моей ситуации. Мне надоело постоянно выводить их на фронт, нажимая на них, чтобы сделать их активными.