来自网络摄像头的视频捕获仅在调试时有效

问题描述 投票:0回答:0

系统和安装信息

  • 系统信息
  • OpenCV 版本 4.7.0
  • 操作系统:Windows 10.0.17763 (Pro - Version 21H2)
  • 制作:3.24.2
  • Python版本:3.8.6
  • OpenCV 版本从 pip 安装(但也作为诊断的一部分从源代码构建,恢复到 pip 版本没有变化)

问题描述

我无法从网络摄像头捕获任何帧,因为我总是收到以下错误:

[ 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 导致了这个问题,但是如果我在调试器中运行它就可以让它工作,所以这似乎无关紧要。

下一步

  1. 我可以做哪些其他调试来帮助解决这个问题?
  2. 是否有 OpenCV(例如)使用的任何核心 Windows 库 我也许可以尝试重新安装,比如 MSMF?如果是这样,怎么样?
  3. 还有其他人看到这个问题吗?
python windows opencv webcam video-capture
© www.soinside.com 2019 - 2024. All rights reserved.