diff --git a/README.md b/README.md index d2b019e..a6d92b1 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,10 @@ A Smart Camera Monitor Tool for Discreet Workspace Management ### 🌟 功能简介 - **实时摄像头监控**:AI捕捉指定区域画面,支持旋转和镜像处理 - **动态变化检测**:当OpenCV识别到画面发生显著变化时自动隐藏指定窗口(如老板靠近!👀) -- **透明置顶窗口**:可调节透明度,完美融入工作环境 -- **30秒自动恢复**:触发隐藏后,30秒自动恢复窗口显示 -- **一键EXE版**:[Releases](https://github.com/CokoIya/VideoGoofOff/releases) 直接下载,无需Python环境 +- **透明置顶窗口**:可调节透明度,完美融入工作环境 +- **30秒自动恢复**:触发隐藏后,30秒自动恢复窗口显示 +- **兼容主流摄像头**:自动选择可用设备,支持绝大多数笔记本内置摄像头 +- **一键EXE版**:[Releases](https://github.com/CokoIya/VideoGoofOff/releases) 直接下载,无需Python环境 ### ⚠️ 已知问题 - **Orbbec摄像头暂不支持**:奥比中光深度摄像头需额外SDK适配(欢迎提交PR!🤝) @@ -70,6 +71,8 @@ MIT License - 自由使用/修改/分享,但上班摸鱼被老板发现后果 30s Auto-Recovery: Hidden windows restore automatically + Webcam Compatibility: auto-selects an available device for most laptop cameras + Pre-built EXE: No Python needed. Download from Releases ⚠️ Known Issues @@ -118,6 +121,8 @@ MIT License - Use freely, but we're not liable if your boss catches you! 30秒自動復旧: 非表示後、30秒でウィンドウ復元 + 主要メーカーのWebカメラに対応: 利用可能なデバイスを自動選択 + EXE版提供: Python不要。Releases から直接実行 ⚠️ 既知の問題 diff --git a/VideoPlayer.py b/VideoPlayer.py index 44a3c0e..ba89495 100644 --- a/VideoPlayer.py +++ b/VideoPlayer.py @@ -21,14 +21,33 @@ class VideoPlayer(QWidget): DEFAULT_ROI = (100, 100, 200, 320) # 默认ROI CHANGE_THRESHOLD = 30000 # 默认阈值 + + def _open_camera(self): + """尝试打开第一个可用摄像头以兼容各品牌设备""" + preferred_backends = [] + if platform.system() == "Windows": + # Windows 常见后端 + preferred_backends = [cv2.CAP_DSHOW, cv2.CAP_MSMF, cv2.CAP_ANY] + else: + # 其他平台常用后端 + preferred_backends = [cv2.CAP_V4L2, cv2.CAP_AVFOUNDATION, cv2.CAP_ANY] + + for index in range(5): + for backend in preferred_backends: + cap = cv2.VideoCapture(index, backend) + if cap.isOpened(): + logging.info(f"Use camera index {index} with backend {backend}") + return cap + cap.release() + return None def __init__(self): # 初始化 super().__init__() # 调用父类初始化 self.enable_change_detection = True # 启用变化检测 - # 打开摄像头 - self.cap = cv2.VideoCapture(0) # 打开摄像头 - if not self.cap.isOpened(): # 如果摄像头未能成功打开 - raise RuntimeError("摄像头未能成功打开,请检查设备") # 退出程序 + # 打开摄像头,兼容多数品牌 + self.cap = self._open_camera() + if self.cap is None: + raise RuntimeError("摄像头未能成功打开,请检查设备") self.hide_windows = False # 隐藏窗口 self.window_handle = -1 # 窗口句柄