【问题标题】:Python OpenCV open window on top of other applicationsPython OpenCV 在其他应用程序之上打开窗口
【发布时间】:2015-09-29 18:17:12
【问题描述】:

执行包含cv2.imshow(img) 的 OpenCV python 脚本时,结果窗口在我的终端窗口后面打开。这是一种轻微的刺激 - 有什么方法可以让它最初在前面/顶部打开?

许多人提出了有关强制持续行为的问题(herehere),但我认为这更简单。

平台 OS X 和 OpenCV 2.4.11

【问题讨论】:

  • 我正在使用“键盘大师”mac 应用程序来执行此操作。首先在键盘mastro中设置一个热键作为前面的活动“python”应用程序,字符串键“opencvwindowinthefront”。然后在 python 脚本中, import os cmd = """ osascript -e '告诉应用程序“系统事件”击键“openvwindowinthefront” ' """ os.system(cmd)

标签: python macos user-interface opencv


【解决方案1】:

解决此问题的一种方法是使用 AppleScript 将 OpenCV 中的所有窗口设置为“最前面”。

subprocess.call(["/usr/bin/osascript", "-e", 'tell app "Finder" to set frontmost of process "Python" to true'])

这样,所有的窗口都应该放在前面。

【讨论】:

  • 为我工作。如果遇到错误:21:62: execution error: Finder got an error: Can’t set process "Python" to true. (-10006),尝试将Python改为python
  • 即使有@MingjiangShi 的提示也对我不起作用。我得到21:62: execution error: Finder got an error: Can’t set process "python" to true. (-10006)
  • @Tom 我怀疑 python 进程名称既不是 Python 也不是 python。可能是python2或python27之类的其他东西。尝试在活动监视器中找出正确的进程名称并相应地更改脚本。
  • 在我将python 更改为python3.7 后为我工作。在“活动监视器”应用>“内存”选项卡中找出进程名称。
  • 另一种在代码中查找进程名的方法:(需要安装psutil):pid = os.getpid(); process = psutil.Process(pid); process_name = process.name()
【解决方案2】:

我可以通过在 OpenCV 发行版中的以下文件中添加一行来做我认为你想做的事:

modules/highgui/src/window_cocoa.mm

它在第 568 行附近,是下面代码中 SETCHELL 之后的单行:

    [window setFrameTopLeftPoint:initContentRect.origin];

    [window setFirstContent:YES];

    [window setContentView:[[CVView alloc] init]];

    [window setHasShadow:YES];
    [window setAcceptsMouseMovedEvents:YES];
    [window useOptimizedDrawing:YES];
    [window setTitle:windowName];
    [window makeKeyAndOrderFront:nil];

// SETCHELL - raise window to top of stacking order
[window setLevel:CGWindowLevelForKey(kCGMaximumWindowLevelKey)];

    [window setAutosize:(flags == CV_WINDOW_AUTOSIZE)];

    [windows setValue:window forKey:windowName];

    [localpool drain];
    return [windows count]-1;
}

CV_IMPL int cvWaitKey (int maxWait)
{

【讨论】:

  • 太棒了 :) 是否有可能仅使用 python api 来做到这一点?
  • @arnaud576875 我认为 Python 只是在 Mac 上调用了这个 Objective-C API。所以,如果你使用 Python,最终还是会调用它。
【解决方案3】:

imshow之前打开一个namedWindow,例如:

cv2.namedWindow('ImageWindowName', cv2.WINDOW_NORMAL)
cv2.imshow('ImageWindowName',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

评论如果这有什么不同。

【讨论】:

  • 这对我没有影响。窗口仍然像以前一样在下面打开。 Anaconda Python 3.5、opencv 3.2.0、Mac OS X Sierra 10.12.5。相反,请参阅此线程 stackoverflow.com/a/8775078/4259243。打开窗口后,运行os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "python" to true' ''') 就可以了。
  • 请注意,这不适用于 macOS Big Sur 11.1。
猜你喜欢
  • 2023-01-27
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2015-10-25
  • 2014-08-07
相关资源
最近更新 更多