Подтвердить что ты не робот

OpenCV: как заставить окно изображения появляться поверх других окон?

Используя cvShowImage, можно легко показать изображение в OpenCV. Однако, как вы сообщаете OpenCV, чтобы показывать окно поверх каждого другого окна?

Я запускаю полноэкранное приложение OpenGL при показе изображений. В первый раз, когда окно OpenCV появляется поверх окна моего приложения, но если я нажму на окно своего приложения (т.е. Вернусь к нему), то мне не удастся вернуть OpenCV поверх OpenGL, даже при уничтожении и воссоздании окна.

Я думал переименовать окно каждый раз, но есть ли другой способ сделать это?

4b9b3361

Ответ 1

OpenCV не имеет собственного способа сделать это (что я знаю).

Ответ зависит от платформы. Если ваша цель - Windows, отметьте этот ответ, а затем this и это, безусловно, будет полезно.

Если вы работаете в Linux, вам нужно взглянуть на то, как был скомпилирован OpenCV, и проверить, какая система была построена (возможно, GTK + 2.x). Затем сделайте собственное исследование.

Ответ 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");

И затем вы можете открыть окно пыльника, которое на самом деле показывает изображение:

Mat your_image = ...;
cv::namedWindow("ShowImg");
cv::imshow("ShowImg", your_image);

Это работает для меня.

Ответ 3

В MAC-OSX (El Capitan) OpenCV 3.1.0 вызов функции moveWindow приводит к тому, что окно просто перемещается в начало.

Ответ 4

Мое решение для OSX состояло в том, чтобы изменить мой код OpenCV (версия 2.4.8), в частности файл windows_cocoa.mm в каталоге highgui/src.

Если вы хотите просто вывести новое окно на передний план, не делая его активным, добавьте следующую строку непосредственно перед концом функции cvNamedWindow() в windows_cocoa.mm:

[window orderFrontRegardless];

Чтобы новое окно всегда было активным, добавьте следующую строку:

[application activateIgnoringOtherApps:YES];

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

Ответ 5

import os os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''')

Добавление этого до того, как любой из моих кодов сработал для меня. Python 3.6.6 и macOS Mojave 10.14.2

Однако будьте осторожны, изображение будет появляться на одном из ваших "рабочих столов", а не на любом экране приложения "Развернутое окно" (когда вы нажимаете зеленую кнопку в левом верхнем углу вашего приложения)

Ответ 6

Я нашел лучшее решение, размещенное в комментариях здесь: открытое окно Python OpenCV поверх других приложений

Просто добавьте команду ниже после открытия окна, например

cv2.namedWindow('img_file_name', cv2.WINDOW_NORMAL) # Creates a window
os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "python" to true' ''') # To make window active

Используйте "питон" в нижнем регистре. Использование "Python", как я нашел в некоторых ответах, дало мне ошибку:

21:62: execution error: Finder got an error: Cant set process "Python" to true. (-10006))

Сначала я попытался отредактировать файл windows_cocoa.mm, как предложено выше, но он не существует на моем компьютере. Я использую Mac OSX Mojave, OpenCV 3.4.2.