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

seb*_*seb 14 c opencv

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

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

我想过每次重命名窗口,但还有另一种方法吗?

Bru*_*sen 9

Beginning with OpenCV releases 3.4.8 and 4.1.2, setWindowProperty has a WND_PROP_TOPMOST property that you can set. Example Python code:

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)
Run Code Online (Sandbox Code Playgroud)

  • 作品!这应该是最重要的答案 (2认同)
  • 事实上,我不知道这是否适用于所有平台,但我验证了它适用于 MacOS (Big Sur)。 (2认同)

小智 8

好吧,我认为它适用于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");
Run Code Online (Sandbox Code Playgroud)

然后你可以打开实际显示图像的花药窗口:

Mat your_image = ...;
cv::namedWindow("ShowImg");
cv::imshow("ShowImg", your_image);
Run Code Online (Sandbox Code Playgroud)

这个对我有用.


kar*_*lip 5

OpenCV没有本机方法(我知道)。

答案取决于平台。如果您的目标是Windows,请先检查此答案,然后再这样做,这肯定会很有用。

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