如何用OpenCV Python在第二台显示器全屏播放视频?
解决OpenCV视频窗口只在Mac主显示器显示的问题
嘿,我明白你现在的需求——用MacBook作为主显示器,想让OpenCV的视频窗口跑到外接的CRT显示器上播放对吧?默认情况下OpenCV会把窗口直接创建在主屏幕上,咱们得手动指定窗口的位置到第二台显示器,再设置全屏。下面是具体的实现方案:
核心思路
OpenCV本身没有直接管理多显示器的API,所以咱们得借助Mac系统的Quartz框架来获取外接显示器的位置参数,然后把OpenCV的窗口移过去,再切换成全屏模式。
第一步:安装依赖库
首先需要安装能调用Mac系统API的库,终端里跑这个命令:
pip install pyobjc-core pyobjc-framework-Quartz
修改后的完整代码
下面是调整后的play_vid函数,我加了获取第二台显示器位置的逻辑,还有窗口移动的步骤:
import cv2 from Quartz import CGDisplayCopyAllDisplays, CGDisplayBounds def get_second_display_position(): # 获取当前所有连接的显示器 all_displays = CGDisplayCopyAllDisplays() # 如果只有一台显示器,直接返回主屏幕的位置(防止报错) if len(all_displays) < 2: bounds = CGDisplayBounds(all_displays[0]) return (int(bounds.origin.x), int(bounds.origin.y)) # 取第二台显示器的左上角坐标(主显示器通常是索引0,外接的是1) second_display_bounds = CGDisplayBounds(all_displays[1]) return (int(second_display_bounds.origin.x), int(second_display_bounds.origin.y)) def play_vid(vid_filename): path_to_vid = "./" # 记得替换成你的视频文件实际路径! cap = cv2.VideoCapture(path_to_vid + vid_filename) if not cap.isOpened(): print("Error opening video stream or file") return # 获取第二台显示器的左上角坐标 display_x, display_y = get_second_display_position() capname = "cap" # 先创建可调整的窗口,不能直接全屏,否则没法移动位置 cv2.namedWindow(capname, cv2.WINDOW_NORMAL) # 把窗口挪到第二台显示器的左上角 cv2.moveWindow(capname, display_x, display_y) # 现在切换成全屏模式 cv2.setWindowProperty(capname, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) while cap.isOpened(): ret, frame = cap.read() if ret: cv2.imshow(capname, frame) # 按Q键退出播放 if cv2.waitKey(25) & 0xFF == ord('q'): break else: break # 清理资源 cap.release() cv2.destroyAllWindows()
关键细节说明
- 获取显示器位置:
get_second_display_position函数通过Mac的Quartz框架拿到所有显示器的边界信息,主显示器一般是第一个(索引0),外接的CRT是第二个(索引1)。如果你的显示器顺序不对,可以打印[CGDisplayBounds(d) for d in all_displays]来查看每个显示器的坐标,调整索引就行。 - 窗口移动顺序:必须先创建普通窗口(
cv2.WINDOW_NORMAL),移动到目标位置后再设置全屏。如果直接设置全屏,OpenCV会默认用主显示器,没法切换。 - 路径替换:记得把
path_to_vid改成你实际存放视频的文件夹路径,不然视频加载会失败。
调试小技巧
如果窗口还是没出现在CRT上,先检查:
- 外接显示器是否正确连接,Mac系统设置里是否识别到了第二台显示器
- 打印
display_x和display_y的值,确认是不是第二台显示器的正确坐标 - 测试视频文件本身能不能正常播放,排除视频损坏的问题
内容的提问来源于stack exchange,提问作者Lynn Le
相关产品推荐
相关产品推荐

