如何使用OpenCV去除cv2.imshow()窗口的标题栏?
解决cv2.imshow()窗口去除标题栏的有效方法
由于OpenCV的cv2.imshow()本身没有原生的无标题栏窗口API,旧方案失效通常是因为OpenCV后端更新或平台差异。以下是分平台的有效解决方法:
方法1:OpenCV原生属性尝试(跨平台基础方案)
先通过cv2.namedWindow()创建窗口,再尝试设置无装饰属性(仅部分后端如Qt支持):
# 在调用imshow前提前创建窗口 cv2.namedWindow("Original Image", cv2.WINDOW_NORMAL) # 尝试设置窗口为无装饰模式(部分平台生效) cv2.setWindowProperty("Original Image", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
如果全屏不符合需求,可结合窗口大小设置后,再用系统级API隐藏标题栏。
方法2:Windows平台专用方案(pywin32实现)
通过Windows系统API直接修改窗口样式,移除标题栏和控制按钮:
首先安装依赖:
pip install pywin32
修改后的完整代码:
import numpy as np import cv2 import pickle import win32gui import win32con width = 640 height = 480 threshold =0.0 maxProb = 0 resultClass = "" cam = cv2.VideoCapture(0) cam.set(3,width) cam.set(4,height) pickle_in = open("model_trained.101sgd","rb") model = pickle.load(pickle_in) def PreProcessing(img): img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) img = cv2.equalizeHist(img) img = img/255 return img # 定义移除标题栏的函数 def remove_title_bar(window_name): hwnd = win32gui.FindWindow(None, window_name) if hwnd: # 移除标题栏、最大化/最小化/关闭按钮 style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE) style = style & ~win32con.WS_CAPTION & ~win32con.WS_THICKFRAME & ~win32con.WS_MINIMIZEBOX & ~win32con.WS_MAXIMIZEBOX & ~win32con.WS_SYSMENU win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, style) # 调整窗口位置和大小(避免偏移) win32gui.SetWindowPos(hwnd, win32con.HWND_TOP, 100, 100, width, height, win32con.SWP_FRAMECHANGED) # 提前创建窗口 cv2.namedWindow("Original Image", cv2.WINDOW_NORMAL) cv2.namedWindow("Processed Image", cv2.WINDOW_NORMAL) while True: success, imgOriginal = cam.read() img = np.asarray(imgOriginal) img = cv2.resize(img,(32,32)) img = PreProcessing(img) cv2.imshow("Processed Image",img) remove_title_bar("Processed Image") img = img.reshape(1,32,32,1) classIndex = int(model.predict_classes(img)) predictions = model.predict(img) probVal = np.amax(predictions) if probVal >threshold: cv2.putText(imgOriginal,str(classIndex) + " " +str(probVal),(50,50),cv2.FONT_HERSHEY_COMPLEX, 1,(0,0,255),1 ) cv2.imshow("Original Image", imgOriginal) remove_title_bar("Original Image") if cv2.waitKey(1) & 0xFF == ord('q'): break cam.release() cv2.destroyAllWindows()
方法3:Linux平台专用方案(Xlib实现)
通过X11 API修改窗口属性,移除装饰:
首先安装依赖:
pip install python-xlib
添加移除标题栏的函数:
import Xlib.display import Xlib.X def remove_title_bar(window_name): display = Xlib.display.Display() root = display.screen().root # 查找目标窗口 target_hwnd = None for win in root.query_tree().children: try: if win.get_wm_name() == window_name: target_hwnd = win break except: pass if target_hwnd: # 发送消息通知窗口管理器移除装饰 protocol = display.intern_atom("_MOTIF_WM_HINTS") hints = Xlib.X.StructureNotifyEvent() hints.type = Xlib.X.ClientMessage hints.window = target_hwnd hints.message_type = protocol hints.format = 32 hints.data.l = [2, 0, 0, 0, 0] target_hwnd.send_event(hints, event_mask=Xlib.X.NoEventMask) display.flush()
在cv2.imshow()之后调用该函数即可。
方法4:macOS平台专用方案(Quartz实现)
通过macOS的Quartz API修改窗口样式:
首先安装依赖:
pip install pyobjc-framework-Quartz
添加移除标题栏的函数:
import Quartz from AppKit import NSApplication def remove_title_bar(window_name): app = NSApplication.sharedApplication() for win in app.windows(): if win.title() == window_name: # 移除标题栏样式 win.setStyleMask_(win.styleMask() & ~Quartz.NSTitledWindowMask) break
同样在cv2.imshow()之后调用该函数。
注意事项
- 必须在
cv2.imshow()之后调用移除标题栏的函数,确保窗口已创建。 - 窗口名称要与
cv2.imshow()的窗口名完全匹配。 - 虚拟环境中安装依赖时,需确保包安装在对应环境内。
内容的提问来源于stack exchange,提问作者Bhetrand Dwilangga
相关产品推荐
相关产品推荐

