Fedora 35系统下如何将截图以字节形式获取?
在Fedora 35下实现截图转字节并接入OpenCV的方案
核心思路
要实现Windows下win32ui类似的截图转字节、接入OpenCV高帧率显示的功能,在Fedora 35上可以通过轻量高效的跨平台截图库或Qt框架实现,以下是两种实用方案:
方案一:使用mss库(高帧率首选)
mss是一款专注于屏幕捕获的轻量库,性能优异,能轻松达到30-60fps的刷新需求,支持直接将截图转为字节流,再转成numpy数组供OpenCV使用。
步骤:
- 安装依赖:
pip install mss opencv-python numpy
- 示例代码:
import mss import numpy as np import cv2 # 初始化屏幕捕获对象 with mss.mss() as sct: # 选择要捕获的显示器(1为主显示器,0为所有显示器拼接) monitor = sct.monitors[1] while True: # 捕获屏幕帧 sct_frame = sct.grab(monitor) # 将截图转为字节流 img_bytes = sct_frame.tobytes() # 字节流转numpy数组(BGRA格式) frame = np.frombuffer(img_bytes, dtype=np.uint8).reshape(sct_frame.height, sct_frame.width, 4) # 转换为OpenCV支持的BGR格式(去掉alpha通道) frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) # 高帧率显示 cv2.imshow("Screen Capture", frame) # 按Q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows()
方案二:使用PyQt5框架(Wayland兼容)
如果你的Fedora 35使用默认的Wayland会话,mss可能存在捕获限制,此时可以用PyQt5的屏幕捕获API,它对Wayland的兼容性更好,同样能实现转字节、接入OpenCV的流程。
步骤:
- 安装依赖:
pip install pyqt5 opencv-python numpy
- 示例代码:
from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QScreen import numpy as np import cv2 import sys # 初始化Qt应用 app = QApplication(sys.argv) screen = QApplication.primaryScreen() while True: # 捕获整个屏幕 qt_frame = screen.grabWindow(0) # 将Qt截图转为字节流 img_bytes = qt_frame.toImage().bits().asstring(qt_frame.byteCount()) # 字节流转numpy数组(BGRA格式) frame = np.frombuffer(img_bytes, dtype=np.uint8).reshape(qt_frame.height(), qt_frame.width(), 4) # 转换为BGR格式供OpenCV使用 frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) # 显示画面 cv2.imshow("Screen Capture", frame) # 按Q键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() sys.exit(app.exec_())
关键说明
- 帧率优化:两种方案都能达到30-60fps的需求,
mss因为更专注于截图,性能略优于PyQt5。 - Wayland适配:若使用Wayland会话,优先选择PyQt5方案;若切换到Xorg会话(登录时选择"GNOME on Xorg"),两种方案都能正常工作。
- 字节流转换:核心是通过库自带的
tobytes()或bits().asstring()方法将截图转为原始字节,再用np.frombuffer()转成numpy数组,无缝对接OpenCV。
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

