问题描述
代码:
import face_recognition as fr
import os
import cv2
import face_recognition
import numpy as np
from time import sleep
def get_encoded_faces():
encoded = {}
for dirpath,dnames,fname in os.walk("./faces"):
for f in fname:
if f.endswith(".jpg") or f.endswith(".png"):
face = fr.load_image_file("faces/" + f)
encoding = fr.face_encodings(face)[0]
encoded[f.split(".")[0]] = encoding
return encoded,fname
def unkNown_image_encoded(img):
face = fr.load_image_file("faces/" + img)
encoding = fr.face_encodings(face)[0]
return encoding
def classify_face(im):
faces,fname = get_encoded_faces()
faces_encoded = list(faces.values())
kNown_face_names = list(faces.keys())
img = cv2.imread(im,1)
face_locations = face_recognition.face_locations(img)
unkNown_face_encodings = face_recognition.face_encodings(img,face_locations)
face_names = []
for face_encoding in unkNown_face_encodings:
matches = face_recognition.compare_faces(faces_encoded,face_encoding)
name = "UnkNown"
face_distances = face_recognition.face_distance(faces_encoded,face_encoding)
best_match_index = np.argmin(face_distances)
if matches[best_match_index]:
name = kNown_face_names[best_match_index]
face_names.append(name)
for (top,right,bottom,left),name in zip(face_locations,face_names):
cv2.rectangle(img,(left-20,top-20),(right+20,bottom+20),(255,0),2)
cv2.rectangle(img,bottom -15),cv2.FILLED)
font = cv2.FONT_HERShey_DUPLEX
cv2.putText(img,name,(left -20,bottom + 15),font,1.0,255,255),2)
return face_names,fname
cap = cv2.VideoCapture(0)
while True:
ret,image = cap.read()
recog,fname = classify_face(image)
print(recog)
cv2.imshow(fname,image)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
video.release()
cv2.destroyAllWindows()
错误:
Traceback (most recent call last):
File "face.py",line 70,in <module>
recog,fname = classify_face(image)
File "face.py",line 37,in classify_face
img = cv2.imread(im,1)
SystemError: <built-in function imread> returned NULL without setting an error
[ WARN:0] global C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wbmte9m7\opencv\modules\videoio\src\cap_msmf.cpp (435) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback
代码在使用图像时可以正常工作,但是现在当我尝试在视频/实时中使用它时会抛出此错误
我想它需要路径而不是传递给它的图像,是否还有其他解决方法
我试图实时识别人脸,并且它的主要问题是检测未知的人脸,所以当我开始实时编码时,出现了此错误。
解决方法
代码和错误消息不同。您正在运行旧版本的代码吗?
错误消息:
文件“ face.py”,第37行,位于classify_face
img = cv2.imread(im,1)
代码:
img = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
对于调试,使用如下代码显示从摄像机接收的帧可能会有所帮助:
i = np.arange(3) + 1
m = (x[np.newaxis] == i[:,np.newaxis,np.newaxis])
np.argmax(np.sum(m,axis=2).T*w,axis=1) + 1
,
cv2.imread(im,1)
要求im
是要读取的图像的文件名(数据类型:字符串)。
使用cap = cv2.VideoCapture(0)
,您不再需要从文件中读取图像,因为要分类的图像是从cap.read()
作为数组返回的。
要修复使用cv2.VideoCapture
的代码,请从img = cv2.imread(im,1)
方法中删除classify_face
并将方法定义更改为
def classify_face(img):
代替
def classify_face(im):
请注意,0
的{{1}}选项是指从索引为cv2.VideoCapture
的摄像机读取实时视频流。