OpenCV:如何强制图像窗口出现在其他窗口的顶部?

时间:2011-12-07 15:08:33

标签: c opencv

使用cvShowImage,可以轻松地在OpenCV中显示图像。但是,您如何告诉OpenCV在每个其他窗口的顶部显示窗口?

我在显示图像时运行全屏OpenGL应用程序。第一次OpenCV窗口弹出我的应用程序窗口,但如果我点击我的应用程序的窗口(即重点关注它),那么我无法让OpenCV回到顶部OpenGL窗口,即使在销毁和重新创建窗口时也是如此。

我想过每次重命名窗口,但还有其他方法吗?

8 个答案:

答案 0 :(得分:7)

从 OpenCV 版本 3.4.8 和 4.1.2 开始,setWindowProperty 具有您可以设置的 WND_PROP_TOPMOST 属性。示例 Python 代码:

import cv2
import numpy as np

window_name = "image"
img = np.zeros([480, 640, 1])
cv2.imshow(window_name, img)
cv2.setWindowProperty(window_name, cv2.WND_PROP_TOPMOST, 1)
cv2.waitKey(0)

答案 1 :(得分:6)

好的,我发现它适用于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);

它对我有用。

答案 2 :(得分:5)

OpenCV没有本地方法来执行此操作(我知道)。

答案取决于平台。如果您的目标是Windows,请选中this answer,然后thisthis肯定会有用。

如果您使用的是Linux,则需要了解OpenCV的编译方式,并检查其构建的系统(可能是GTK + 2.x)。然后,做一些你自己的研究。

答案 3 :(得分:3)

在MAC-OSX(El Capitan)OpenCV 3.1.0上,调用moveWindow似乎将窗口移到了顶部。

答案 4 :(得分:1)

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

但是请注意,图像将弹出在您的“桌面”之一上,而不是在任何“最大化的窗口”应用程序屏幕中弹出(当您按下应用程序左上方的绿色按钮时)

答案 5 :(得分:0)

我的OSX解决方案是修改我的OpenCV代码(版本2.4.8),特别是highgui / src目录中的文件windows_cocoa.mm。

如果您只是将新窗口置于前面而不将其激活,请在windows_cocoa.mm中的函数cvNamedWindow()结尾之前添加以下行:

[window orderFrontRegardless];

要强制新窗口始终处于活动状态,请添加以下行:

[application activateIgnoringOtherApps:YES];

它可能不是所有窗户的最佳选择,但在我的情况下工作。我厌倦了总是不得不通过点击它们将它们带到前面来激活它们。

答案 6 :(得分:0)

我发现我所要做的只是将主窗口设置为全屏,然后恢复正常。我不需要打开单独的窗口。我不需要显示虚拟图像。我不需要致电waitKey。

    #!/usr/bin/env python
    import cv2
    import numpy

    WindowName="Main View"
    view_window = cv2.namedWindow(WindowName,cv2.WINDOW_NORMAL)

    # These two lines will force your "Main View" window to be on top with focus.
    cv2.setWindowProperty(WindowName,cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
    cv2.setWindowProperty(WindowName,cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_NORMAL)

    # The rest of this does not matter. This would be the rest of your program.
    # This just shows an image so that you can see that this example works.
    img = numpy.zeros((400,400,3), numpy.uint8)
    for x in range(0,401,100):
        for y in range(0,401,100):
            cv2.line(img,(x,0),(0,y),(128,128,254),1)
            cv2.line(img,(x,399),(0,y),(254,128,128),1)
            cv2.line(img,(399,y),(x,399),(128,254,128),1)
            cv2.line(img,(399,y),(x,0),(254,254,254),1)
    cv2.imshow(WindowName, img)
    cv2.waitKey(0)
    cv2.destroyWindow(WindowName)

答案 7 :(得分:-1)

我找到了发表在评论中的最佳解决方案:Python OpenCV open window on top of other applications

例如,打开一个窗口后,只需在下面添加命令即可。

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”。我在一些答案中发现,使用“ Python”给我一个错误:

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

起初,我按照上面的建议尝试编辑windows_cocoa.mm文件,但是该文件在我的计算机中不存在。我正在使用Mac OS X Mojave,OpenCV 3.4.2。