You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pygame与OpenCV时调用camera.release()致GUI严重卡顿求助

问题

使用Pygame和OpenCV制作带按钮与摄像头的简易GUI时,调用camera.release()关闭摄像头会导致整个GUI严重卡顿。

相关代码片段:

if event.type == pygame.MOUSEBUTTONDOWN:
    # 3. here the interactions with the click of the mouse
    if b0.rect.collidepoint(pygame.mouse.get_pos()): 
        print("ON") # print text of button 1
            
    if b1.rect.collidepoint(pygame.mouse.get_pos()):
        camera.release() # turns the webcam off 
        print("OFF") # prints text of button 2 
解决方法
  • 避免在事件主线程执行阻塞操作:camera.release()涉及硬件资源同步释放,会直接阻塞负责GUI渲染和事件响应的Pygame主线程,引发卡顿。可以把释放操作放到单独线程中执行:
import threading

# ... 其他原有代码 ...

if event.type == pygame.MOUSEBUTTONDOWN:
    if b0.rect.collidepoint(pygame.mouse.get_pos()): 
        print("ON")
            
    if b1.rect.collidepoint(pygame.mouse.get_pos()):
        # 用守护线程执行释放,不阻塞主线程
        def release_cam():
            camera.release()
            print("OFF")
        threading.Thread(target=release_cam, daemon=True).start()
  • 延迟到帧更新阶段执行释放:通过状态标记把释放操作移到主循环的非事件处理阶段,避开回调阻塞风险:
# 定义状态变量
should_release_camera = False

# Pygame主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            if b0.rect.collidepoint(pygame.mouse.get_pos()): 
                print("ON")
            if b1.rect.collidepoint(pygame.mouse.get_pos()):
                should_release_camera = True
                print("OFF")
    
    # 在帧更新环节处理释放
    if should_release_camera:
        camera.release()
        should_release_camera = False
    
    # ... 原有摄像头帧捕获、GUI渲染代码 ...

内容的提问来源于stack exchange,提问作者Saltbottle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:01:04