Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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!🤝)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -118,6 +121,8 @@ MIT License - Use freely, but we're not liable if your boss catches you!

30秒自動復旧: 非表示後、30秒でウィンドウ復元

主要メーカーのWebカメラに対応: 利用可能なデバイスを自動選択

EXE版提供: Python不要。Releases から直接実行

⚠️ 既知の問題
Expand Down
27 changes: 23 additions & 4 deletions VideoPlayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 # 窗口句柄
Expand Down