2

OpenCV 很新,所以请多多包涵:

我需要为用户输入打开一个临时窗口,但我需要确定它不会覆盖以前打开的窗口。

有没有办法打开一个匿名窗口,或者以某种方式创建一个保证唯一的窗口名称?

显然,一个长的随机字符串会非常安全,但这似乎是一个 hack。

PS 我目前正在使用 python 绑定,但如果你想用 c/c++ 编写响应,那很好,我对它们很熟悉。

4

2 回答 2

2

modules/highgui/src/window_w32.cpp(或在其他文件中,如果您不使用 windows - 查看void cv::namedWindow( const string& winname, int flags )in ...src/window.cpp)有一个static CvWindow* icvFindWindowByName( const char* name )可能是您需要的功能,但它是内部的,因此 OpenCV 的作者出于某种原因不希望其他人使用它(或不'不知道有人可能需要它)。

我认为最好的选择是使用系统 api 来查找是否存在具有特定名称的窗口。
最终使用几乎不可能成为窗口名称的东西,例如以毫秒为单位的当前时间 + 用户名 + 随机数 + 随机字符串(是的,我知道窗口名称“234564312cyriel123234123dgbdfbddfgb#$%grw$”并不漂亮)。

于 2012-12-27T02:30:22.073 回答
1

我自己想出了一个可能的解决方案:

围绕 imshow 和 namedWindow 的一些简单包装器允许将所有当前窗口名称的列表记录在全局变量中。

window_list = []
def new_window(name=None):
    if name == None:
        i=0
        while str(i) in window_list:
            i = i+1
        name = str(i)
    if name not in window_list:
        window_list.append(name)
    cv2.namedWindow(name)        #always create the window, in case it's been manually closed
                                 #does nothing if window is already open
    return name

def img_show(img, name=None):
    name = new_window(name)
    cv2.imshow(name, img)
    return name

对 img_show 的不带名称调用提供了一个递增的默认名称。

这与在 IDL 中获得的行为有点相似。显然这不是最强大的解决方案,并且要求所有代码都使用这些包装器,但它现在可以满足我的需求。

于 2012-12-27T16:08:57.503 回答