使用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
相关产品推荐
相关产品推荐

