当命令行中的脚本为 运行 时,视频捕获失败

Video Capture fails when script is run from the command line

我已在此设备上广泛使用 OpenCV Python,但从未遇到过此问题。我是 运行ning Windows 8.1 Pro x64。我在两个不同的网络摄像头上遇到了同样的问题。

当我将脚本迁移到具有多处理功能的不同进程时,我第一次遇到了这个问题。 (OpenCV 仅在一个进程中运行,带有一个网络摄像头)。我担心像其他一些模块一样,这是 OpenCV 在不同的环境中扮演 运行,但无论如何我只遇到过多线程问题。似乎与此无关,而是我现在从命令行执行整个程序的事实。

如果我 运行 在 python IDLE 或命令行 IDLE 中使用下面的视频捕获对象的基本脚本,它 运行 是正常的。我的 python 的 ENV PATH 签出了与 3.8.

相同的安装
import cv2

cap = cv2.VideoCapture(0)

running, _ = cap.read()
while running:

   running, frame = cap.read()

   cv2.imshow("Feed", frame)

   key = cv2.waitKey(1)
   if key & 0xFF == ord("q"):
        
          running = False

cap.release()
cv2.destroyAllWindows()

但是,如果我使用这些内容创建一个名为 'test.py' 的脚本,并在终端 运行 它,我会收到一系列错误并且无法打开网络摄像头。

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\...\scripts>test.py

[ WARN:0] global C:\Users\appveyor\AppData\Local\Temp\pip-req-build-h4wtvo23\o
pencv\modules\videoio\src\cap_msmf.cpp (373) `anonymous-namespace'::SourceReader
CB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -214
7024891
[ WARN:0] global C:\Users\appveyor\AppData\Local\Temp\pip-req-build-h4wtvo23\o
pencv\modules\videoio\src\cap_msmf.cpp (385) `anonymous-namespace'::SourceReader
CB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error sta
tus: -2147024891
[ WARN:1] global C:\Users\appveyor\AppData\Local\Temp\pip-req-build-h4wtvo23\o
pencv\modules\videoio\src\cap_msmf.cpp (912) CvCapture_MSMF::grabFrame videoio(M
SMF): can't grab frame. Error: -2147024891
[ WARN:1] global C:\Users\appveyor\AppData\Local\Temp\pip-req-build-h4wtvo23\o
pencv\modules\videoio\src\cap_msmf.cpp (435) `anonymous-namespace'::SourceReader
CB::~SourceReaderCB terminating async callback

我已经尝试了 'cv2.CAP_DSHOW' 中一些建议的修复,虽然它删除了警告,但我得到的只是一个黑框。

我解决了这个问题,原来是卡巴斯基反病毒软件将网络摄像头访问视为威胁,只有在从终端执行时才会发生。

感谢 johncasey 在此处的回答: Webcam + Open CV Python | Black screen

从卡巴斯基报告中可以清楚地看出,脚本文件被标记并受到限制,返回黑框或完全阻止 OpenCV 运行。我将 script.py 从 'Host Intrusion Protection' 下的 'Low Restricted' 类别移至 'Trusted',这解决了问题。

Kasperky Host Intrusion Protection

这也解释了现在与 MSMF 相关的警告。