OpenCV 3.4调用imshow重复打开同名窗口问题求助
解决Windows下OpenCV同名窗口重复创建的问题
我之前在Windows环境下用OpenCV做项目时,刚好踩过这个一模一样的坑!问题根源其实出在你定义窗口名称时手动加的\0空字符上,和Windows平台的窗口管理机制有关。
问题原因分析
你定义窗口名的时候加了末尾的\0:
const string RefFrame = "Referenz Frame\0";
在Linux系统中,窗口管理器处理字符串时会忽略末尾的空字符,所以namedWindow和imshow用的是同一个有效窗口名;但在Windows下,系统会把\0当作字符串的结束标记,导致实际识别的窗口名是"Referenz Frame",而你后续所有用带\0的字符串调用OpenCV窗口函数时,OpenCV会认为这是一个全新的窗口名,于是重复创建窗口,自然resizeWindow也会失效。
解决方案
只需要去掉所有窗口名字符串末尾的\0即可,因为C++的std::string本身会自动维护字符串的结束符,不需要手动添加。
修改后的窗口名定义:
const string RefFrame = "Referenz Frame"; const string MatchFrame = "Matching Frame"; const string FinalFrame = "Transformated Frame";
另外,你在DrawMatches函数里每次调用imshow后都重复调用resizeWindow其实没必要,初始化阶段已经设置过窗口大小了;不过如果需要保证窗口在交互过程中不会被用户拖改大小,可以在namedWindow时加上额外参数锁定比例,比如:
namedWindow(RefFrame, WINDOW_NORMAL | WINDOW_KEEPRATIO);
验证效果
修改后再运行代码,namedWindow创建的窗口会被imshow正确复用,不会再出现同名的第二个窗口,resizeWindow的设置也会正常生效,和Linux环境下的表现一致。
内容的提问来源于stack exchange,提问作者Michael Kirchhof
相关产品推荐
相关产品推荐

