从命令行运行脚本时,视频捕获失败



我在这个设备上广泛使用了OpenCV for Python,从未遇到过这个问题。我运行的是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:UsersappveyorAppDataLocalTemp1pip-req-build-h4wtvo23o
pencvmodulesvideoiosrccap_msmf.cpp (373) `anonymous-namespace'::SourceReader
CB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -214
7024891
[ WARN:0] global C:UsersappveyorAppDataLocalTemp1pip-req-build-h4wtvo23o
pencvmodulesvideoiosrccap_msmf.cpp (385) `anonymous-namespace'::SourceReader
CB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error sta
tus: -2147024891
[ WARN:1] global C:UsersappveyorAppDataLocalTemp1pip-req-build-h4wtvo23o
pencvmodulesvideoiosrccap_msmf.cpp (912) CvCapture_MSMF::grabFrame videoio(M
SMF): can't grab frame. Error: -2147024891
[ WARN:1] global C:UsersappveyorAppDataLocalTemp1pip-req-build-h4wtvo23o
pencvmodulesvideoiosrccap_msmf.cpp (435) `anonymous-namespace'::SourceReader
CB::~SourceReaderCB terminating async callback

我已经尝试了一些人建议的"cv2.CAP_DSHOW"修复程序,尽管它删除了警告,但我得到的只是一个黑框。

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

johncasey的回答提供:网络摄像头+Open CV Python |黑屏

从卡巴斯基的报告中可以清楚地看到,脚本文件被标记并受到限制,返回黑框或根本无法运行OpenCV。我将script.py从"主机入侵保护"下的"低限制"类别移到了"受信任"类别,这解决了问题。

Kasperky主机入侵保护

这也解释了与MSMF有关的警告。

最新更新