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

使用OpenCV+pyvirtualcam修复摄像头绿线时遇AttributeError问题求助

问题解决:pyvirtualcam报错与Windows虚拟摄像头方案

报错原因分析

你遇到的AttributeError: 'NoneType' object has no attribute 'send'是因为代码结构错误:pyvirtualcam.Camera的with块仅执行打印操作就退出了,with语句会在块结束时自动关闭虚拟摄像头并释放cam对象,后续循环中调用cam.send()时,cam已经是None,因此触发错误。

修复后的代码

将摄像头读取、图像处理及虚拟摄像头推送的逻辑全部放入with块内,确保cam对象在有效生命周期内被调用:

import cv2
import pyvirtualcam
from pyvirtualcam import PixelFormat

# 读取物理摄像头
webcam = cv2.VideoCapture(0)
# 设置分辨率为1280x720
webcam.set(3, 1280)
webcam.set(4, 720)

# 读取修复用的掩码(mask.jpg需提前准备,绿线区域设为白色)
mask = cv2.imread('mask.jpg', cv2.IMREAD_GRAYSCALE)

# 启动虚拟摄像头,将后续逻辑放入with块内
with pyvirtualcam.Camera(1280, 720, 30, fmt=PixelFormat.BGR) as cam:
    print('虚拟摄像头设备: ' + cam.device)
    
    if webcam.isOpened():
        success, frame = webcam.read()
        while success:
            success, frame = webcam.read()
            
            # 使用INPAINT_NS算法修复绿线区域
            frame = cv2.inpaint(frame, mask, 3, cv2.INPAINT_NS)
            
            # 水平翻转画面(适配镜像需求)
            frame = cv2.flip(frame, 1)
            
            # 显示处理后的画面,按ESC退出
            cv2.imshow("webcamfix", frame)
            key = cv2.waitKey(5)
            if key == 27:  # ESC键
                break
            
            # 推送画面到虚拟摄像头
            cam.send(frame)
            cam.sleep_until_next_frame()

# 释放资源
webcam.release()
cv2.destroyAllWindows()

Windows平台Python创建虚拟摄像头的简便方法

  • OBS虚拟摄像头(推荐)
    安装OBS Studio并启用虚拟摄像头功能(OBS设置-工具-虚拟摄像头),pyvirtualcam会自动识别OBS后端,无需额外配置即可推送画面到OBS虚拟摄像头,支持Discord、Google Meet等所有主流视频会议软件。
  • Unity Capture
    安装Unity Capture驱动后,pyvirtualcam可直接将画面输出到Unity Capture虚拟设备,适合轻量场景,资源占用比OBS低。
  • OBS滤镜直接处理
    如果仅需修复水平绿线,可直接在OBS中添加物理摄像头作为源,通过"滤镜-视频滤镜"的裁剪/修复类功能处理,无需编写Python代码,操作更简便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:55:16