如何在cv2.imshow的窗口标题中正确显示中文?
Windows下OpenCV imshow中文窗口标题乱码解决办法
问题根源
Windows平台中,OpenCV的cv2.imshow()窗口标题默认采用GBK编码处理,而Python 3的字符串默认是UTF-8编码,编码不匹配导致中文标题乱码。
可行解决方案
方案一:调用Windows API直接设置窗口标题
通过ctypes调用Windows系统API,直接修改已创建窗口的标题,避开OpenCV的编码问题,稳定性更高。
修改后的完整代码:
import cv2 import ctypes # 加载Windows用户态API库,获取设置窗口标题的函数 user32 = ctypes.WinDLL('user32', use_last_error=True) SetWindowTextW = user32.SetWindowTextW SetWindowTextW.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p] cap = cv2.VideoCapture(0) # 先创建临时窗口(用英文标题避免乱码) ret, frame = cap.read() cv2.imshow('temp_win', frame) # 获取窗口句柄 window_handle = cv2.getWindowHandle('temp_win') # 设置中文标题 SetWindowTextW(window_handle, '摄像头画面') while True: ret, frame = cap.read() if not ret: break cv2.imshow('temp_win', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
方案二:编码转换适配OpenCV的GBK要求
将中文标题转换为GBK编码的字节流,再通过单字节编码解码为字符串,让OpenCV能正确解析中文。
修改后的完整代码:
import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: break # 编码转换:UTF-8中文转GBK字节,再用iso-8859-1解码为字符串 chinese_title = '中文'.encode('gbk').decode('iso-8859-1') cv2.imshow(chinese_title, frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
说明
- 方案一通过系统API直接操作窗口,不受OpenCV版本或Python编码设置影响,推荐使用。
- 方案二依赖编码转换,若系统默认编码不是GBK(极少情况)可能失效,但代码更简洁。
内容的提问来源于stack exchange,提问作者郑远程
相关产品推荐
相关产品推荐

