【问题标题】:OpenCV anonymous/guaranteed unique windowOpenCV 匿名/保证唯一窗口
【发布时间】:2012-12-26 01:23:40
【问题描述】:

对 OpenCV 很陌生,所以请多多包涵:

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

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

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

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

【问题讨论】:

  • 嗨,我不确定我是否关注。是什么阻止您为窗口指定不同的名称(即imshow("window1", mat1); imshow("tempWindow", mat2))?你能澄清一下吗?
  • 这是一个库函数。如果某些客户端代码已经有了一个名为“tempWindow”的窗口会怎样?
  • 我明白了。我不认为 OpenCV 本身通过其简单的 GUI 功能提供此功能,您可能必须自己使用某种“hack”(或者像您说的那样随机字符串,或者让客户端代码提供名称作为参数等)

标签: python opencv


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    围绕 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 中的行为大致相似。显然这不是最强大的解决方案,并且要求所有代码都使用这些包装器,但它现在可以满足我的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-25
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2013-01-07
      相关资源
      最近更新 更多