我无法从网络摄像头捕获任何帧,因为我总是收到以下错误:
[ WARN:[email protected]] global cap_msmf.cpp:1759 CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638
相机打开正常,因为网络摄像头旁边的灯亮起,vid.isOpened() 返回 true。我尝试使用辅助外部 USB 网络摄像头 (Logitec),我有相同的行为。如果我使用
cv2.CAP_DSHOW
后端运行它,那么警告就会消失,但是图像仍然没有显示。该摄像头适用于其他应用程序,例如 MS Teams、Google Meet 和 Windows 自带的内置摄像头应用程序。
我尝试删除并重新添加 OpenCV,但没有帮助。我也尝试从源代码编译它,但仍然没有运气。我也尝试了 contrib 构建,但这没有效果。我相信这可能在某种程度上与我的硬件有关,因为我可以毫无问题地在同事的笔记本电脑上运行相同的脚本。然而,我尝试过的两个相机都可以与其他应用程序一起使用,所以我不知道是什么导致它失败。
如果我通过 Python 调试器(使用
python -m pdb webcam.py
或通过 VS Code 运行器)运行它,那么奇怪的是它可以工作。我检查的第一件事是没有安装多个版本并且调试器没有调用一个版本而不是另一个版本,但它们似乎没有变化。它是相同版本的 Python 和相同版本的 OpenCV。
我发现另一个人有完全相同的问题,但似乎没有得到解决:https://answers.opencv.org/question/220309/videocapture-from-camera-works-only-in-debug -蟒蛇/
我也在 C++(OpenCV)中尝试过,并在 Rust(非 OpenCV)中使用了不同的库,但都无法从内置网络摄像头或外部网络摄像头成功捕获帧。
复制问题的代码,没什么特别的:
# import the opencv library
import cv2
import sys
print(sys.version_info)
print("OPEN CV: ", cv2.__version__)
# define a video capture object
vid = cv2.VideoCapture(0)
# vid = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cv2.namedWindow('Test Window', cv2.WINDOW_NORMAL)
print("Camera Opened: ", vid.isOpened())
while(True):
# Capture the video frame
ret, frame = vid.read()
if ret:
cv2.imshow('Test Window', frame)
else:
print("Error Drawing Frame")
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# After the loop release the cap object
vid.release()
# Destroy all the windows
cv2.destroyAllWindows()
如果我启用
OPENCV_VIDEOIO_DEBUG
环境变量(Set-Item -Path Env:OPENCV_VIDEOIO_DEBUG -Value ($Env:OPENCV_VIDEOIO_DEBUG + ";1"
)然后它会给出不同的错误,但这可能是一个转移注意力的问题。为了完整性,我把它贴在这里:
Traceback (most recent call last):
File "C:\Users\user1\AppData\Local\Programs\Python\Python38\lib\site-packages\cv2\__init__.py", line 181, in <module>
bootstrap()
File "C:\Users\user1\AppData\Local\Programs\Python\Python38\lib\site-packages\cv2\__init__.py", line 153, in bootstrap
native_module = importlib.import_module("cv2")
File "C:\Users\user1\AppData\Local\Programs\Python\Python38\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ImportError: DLL load failed while importing cv2: A dynamic link library (DLL) initialization routine failed.
虽然我不知道是哪个 DLL 导致了这个问题,但是如果我在调试器中运行它就可以让它工作,所以这似乎无关紧要。