实时尝试时OpenCv读取错误

问题描述

代码

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的摄像机读取实时视频流。