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];

Это, вероятно, не лучшая идея для всех окон, но работает в моей ситуации. Мне надоело постоянно выводить их на фронт, нажимая на них, чтобы сделать их активными.