Python中OpenCV/QT的QMimeDatabase错误消除求助
问题
运行基于OpenCV的Python摄像头视频流代码时,程序功能正常(摄像头窗口可正常打开),但每次都会弹出QMimeDatabase加载错误:QMimeDatabase: Error loading internal MIME data: Error in line 1 of <internal MIME data>: Premature end of document(对应中文提示:
代码如下:
import cv2 cap = cv2.VideoCapture(1, cv2.CAP_DSHOW) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 120) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 160) cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('Y','1','6',' ')) cap.set(cv2.CAP_PROP_CONVERT_RGB, 0) cv2.namedWindow("frame", cv2.WINDOW_NORMAL) while True: ret, frame = cap.read() frame = cv2.normalize(frame, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U) cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break
环境信息:
OS: Windows 10 64bit Python: 3.7.15 (conda环境) OpenCV: 4.6.10 (conda-forge安装) Numpy: 1.21.5 qt-main: 5.15.2 (安装OpenCV时自动安装)
解决方法
该错误源于OpenCV依赖的Qt组件(qt-main 5.15.2)中QMimeDatabase加载内部MIME数据的bug,以下是几种可行的消除方案:
设置Qt环境变量跳过MIME数据库加载
在导入cv2前设置环境变量,让Qt跳过内部MIME数据加载,避免触发错误:import os os.environ['QT_NO_MIME_DB'] = '1' os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = '' import cv2 # 后续代码保持不变更换OpenCV的视频捕获/窗口后端
尝试改用CAP_MSMF作为视频捕获后端,同时调整窗口创建参数,避开Qt的GUI问题:cap = cv2.VideoCapture(1, cv2.CAP_MSMF) # 改用WINDOW_AUTOSIZE替代WINDOW_NORMAL cv2.namedWindow("frame", cv2.WINDOW_AUTOSIZE)降级Qt版本
conda-forge的qt-main 5.15.2存在该MIME数据加载问题,降级到5.15.0版本可解决:conda install qt-main=5.15.0 -c conda-forge抑制Qt错误日志输出
如果上述方法无效,直接屏蔽Qt的错误日志输出:import os import ctypes # 抑制Windows系统错误弹窗 ctypes.CDLL('kernel32').SetErrorMode(0x0001 | 0x0002) # 关闭Qt所有日志输出 os.environ['QT_LOGGING_RULES'] = '*.debug=false;*.warning=false;*.error=false' import cv2 # 后续代码保持不变
内容的提问来源于stack exchange,提问作者amisotcm
相关产品推荐
相关产品推荐

