下面是相关代码
import cv2 as cv
import numpy as np
video = cv.VideoCapture(0) #tells obj to use built in camera\
#create a face cascade object
face_cascade =
cv.CascadeClassifier(r"C:\Users\xxxxxxx\AppData\Roaming\Python\Python36\site-
packages\cv2\data\haarcascade_frontalcatface.xml")
a = 1
#create loop to display a video
while True:
a = a + 1
check, frame = video.read()
print(frame)
#converts to a gray scale img
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
#create the faces
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5)
for(x, y, w, h) in faces:
print(x, y, w, h)
#show the image
cv.imshow('capturing', gray)
key = cv.waitKey(1) #gen a new frame every 1ms
if key == ord('q'): #once you enter 'q' the loop will be exited
break
print(a) #this will print the number of frames
#captures the first frame
video.release() #end the web cam
#destroys the windows when you are not defined
cv.destroyAllWindows()
该代码显示从我的网络摄像机捕获的视频。尽管如此,OpevCV似乎并没有处理任何帧,因为所有帧看起来都是这样
[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]]
我假设表示它们为空。
我认为这阻止了算法能够检测到帧中的我的脸。我觉得问题出在ffmpeg编解码器中,但是即使是这种情况,我也不确定如何继续。
操作系统:Windows 10 语言:Python
编辑:框架不是空的,但是数组中的所有值似乎都是'0'
为什么框架为空,如何获得OpenCV来检测框架中的人脸?
答案 0 :(得分:1)
有时无法读取图像,因此cv2返回一个空矩阵,您需要确保该框架不为空。
...
while True:
a += 1
check, frame = video.read()
if not check or frame.empty():
continue
...
答案 1 :(得分:1)
确保您可以连接到相机
...
while True:
a = a + 1
if video.isOpened():
check, frame = video.read()
print(frame)
...
答案 2 :(得分:1)
如果您使用Windows,似乎会发生这种情况
出现此警告后,我想出了解决方案
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
我找到了答案here
video = cv.VideoCapture(0, cv2.CAP_DSHOW)
根据文档cv2.CAP_DSHOW指的是Direct Show,它是一种多媒体框架和API,用于对媒体文件或流执行各种操作。
中有一个示例答案 3 :(得分:0)
我认为这是由于防病毒所致。尝试禁用它。