OpenCV はまったく新しいので、ご容赦ください。
ユーザー入力用に一時ウィンドウを開く必要がありますが、以前に開いたウィンドウが上書きされないようにする必要があります。
匿名ウィンドウを開く方法、または保証された一意のウィンドウ名を作成する方法はありますか?
明らかに、長いランダムな文字列はかなり安全ですが、それはハックのようです。
PS 現時点では python バインディングを使用していますが、c/c++ で応答を書きたい場合は、それらに精通しています。
(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を使用して、特定の名前のウィンドウが存在するかどうかを確認するのが最善の方法だと思います。
最終的には、ウィンドウ名にすることはほとんど不可能なものを使用します。たとえば、現在のミリ秒 + ユーザー名 + 乱数 + ランダムな文字列です (ウィンドウ名 "234564312cyriel123234123dgbdfbddfgb#$%grw$" は美しくないことはわかっています)。
私は自分で可能な解決策を思いついた:
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で得られる動作と漠然と似ています。明らかに、これは最も堅牢なソリューションではなく、すべてのコードでこれらのラッパーを使用する必要がありますが、今のところ私のニーズには対応しています。