对OpenCV来说很新,所以请耐心等待:
我需要打开一个用户输入的临时窗口,但我需要确定它不会覆盖之前打开的窗口。
有没有办法打开匿名窗口,或以某种方式创建一个保证唯一的窗口名称?
显然,一个长的随机字符串会非常安全,但这似乎是一个黑客。
P.S。我现在正在使用python绑定,但是如果你想用c / c ++写一个很好的响应,我就熟悉它们。
答案 0 :(得分:2)
在modules/highgui/src/window_w32.cpp
(或在其他文件中,如果您不使用Windows - 请查看void cv::namedWindow( const string& winname, int flags )
中的...src/window.cpp
),有一个函数static CvWindow* icvFindWindowByName( const char* name )
可能就是您需要,但它是内部的,所以OpenCV的作者出于某种原因不希望其他人使用它(或者不知道有人可能需要它)。
我认为最好的选择是使用系统api来查找是否存在具有特定名称的窗口 最终使用几乎不可能成为窗口名称的东西,例如ms的当前时间+用户名+随机数+随机字符串(是的,我知道窗口名称“234564312cyriel123234123dgbdfbddfgb#$%grw $”并不漂亮)。
答案 1 :(得分: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中的行为模糊地相似。显然,这不是最强大的解决方案,并要求所有代码都使用这些包装器,但它现在可以满足我的需求。