Python:Anaconda3 Python 3.8.5 OpenCV:4.5.1
我用 CMake 编译了 OpenCV 和 OpenCV-Contrib,所以我可以在 python 中使用
cuda
函数。
现在我正在尝试使用 cv2.cuda_CascadeClassifier().detectMultiScale()
功能检测人脸。
当我运行它时,一切正常,直到行:gpu_result = model.classifier_cuda.detectMultiScale(gpu_frame)
也用**code**
标记它。
一旦这条线被执行,程序就会停止。
我已将终端的输出从头到尾放在我的代码下方。
import time
start_time = time.time()
import cv2
import os
clear = lambda: os.system('cls')
def printMessageWithTime(message):
print(f"[INFO] {message} - Time: {time.time() - start_time}s")
def most_frequent_element_in_list(list):
counter = 0
num = list[0]
for i in list:
curr_frequency = list.count(i)
if(curr_frequency>counter):
counter = curr_frequency
num = i
return num
printMessageWithTime("Programm started, packages loaded!")
print("OpenCV Version: " + cv2.__version__)
class Model():
def __init__(self, modelNumber):
self.trainers_path = "C:/Users/Student/Documents/models"
self.trainer_main_name = "_percent_trainer"
self.trainer_names = ["1","5","10"]
self.model_number = modelNumber
self.choosen_trainer = f"{self.trainers_path}/{self.trainer_names[self.model_number]}{self.trainer_main_name}.xml"
self.cascadePath = "C:/Users/Student/Documents/repos/ai_face_recognition/ai_face_recognition/testing/haarcascade_frontalface_default.xml" #cv2.data.haarcascades +
self.cudacascadePath = "C:/Users/Student/Desktop/new build/opencv-4.5.1/data/haarcascades_cuda/haarcascade_frontalface_default.xml"
self.faceCascade = cv2.CascadeClassifier(self.cascadePath)
self.classifier_cuda = cv2.cuda_CascadeClassifier(self.cudacascadePath)
self.recognizer = cv2.face.LBPHFaceRecognizer_create()
self.recognizer.read(self.choosen_trainer)
model = Model(0)
printMessageWithTime("Model data loaded!")
class Camera():
def __init__(self, resolution):
self.width = resolution[0]
self.height = resolution[1]
self.cam = cv2.VideoCapture(0)
self.cam.set(3,self.width)
self.cam.set(4,self.height)
self.minW = 0.25*self.cam.get(3)
self.minH = 0.25*self.cam.get(4)
Cam = Camera([640,480])
printMessageWithTime("Camera set up!")
detected_ids = []
font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
while True:
start_time = time.time()
ret, img = Cam.cam.read()
gray_frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gpu_frame = cv2.cuda_GpuMat(gray_frame)
printMessageWithTime("Detecting")
** gpu_result = model.classifier_cuda.detectMultiScale(gpu_frame)**
printMessageWithTime("Detecting finished")
result = gpu_result.download() # UMat
id = 0
confidence = 0
for(x,y,w,h) in result:
cv2.rectangle(img, (x,y),(x+w,y+h), (0,255,0), 2)
id, confidence = model.recognizer.predict(gray_frame[y:y+h,x:x+w])
if confidence < 100:
id = str(id)
else:
id = "unknown"
confidence = " {0}%".format(round(100-confidence))
cv2.putText(img, str(id), (x+5,y-5),font,1,(255,255,255),2)
cv2.putText(img,str(confidence),(x+5,y+h-5),font,1,(255,255,0),1)
detected_ids.insert(0,id)
if len(detected_ids) > 40:
del detected_ids[0]
most_frequent_id = most_frequent_element_in_list(detected_ids)
end_time = time.time()
try:
fps = 1 / (end_time - start_time)
except:
print("Can not calculate fps, due to division by 0!")
print(f"[INFO] Time for detection: {end_time - start_time}, Detected Person: {most_frequent_id} - Confidence: {confidence}")
cv2.imshow('camera',img)
k = cv2.waitKey(10) & 0xff
if k == 27:
break
Cam.cam.release()
cv2.destroyAllWindows()
print("\n[INFO] Exiting program")
PS C:\Users\Student\Documents\repos\ai_face_recognition\ai_face_recognition> & C:/Users/Student/anaconda3/python.exe c:/Users/Student/Documents/repos/ai_face_recognition/ai_face_recognition/recognizer/recognizer_2.py
[INFO] Programm started, packages loaded! - Time: 0.4229726791381836s
OpenCV Version: 4.5.1
[INFO] Model data loaded! - Time: 11.675345182418823s
[INFO] Camera set up! - Time: 41.83551025390625s
[INFO] Detect - Time: 1.9768860340118408s
PS C:\Users\Student\Documents\repos\ai_face_recognition\ai_face_recognition>
我尝试了为 detectMultiScale 函数创建框架的不同方法,如以下问题所述:“Cuda CascadeClassifier detectMultiScale output is unreadable。 以及这个问题:cv2.cuda_CascadeClassifier in python 但是他们的问题和我的问题不同,我根本没有收到任何错误,并且描述的所有解决方案都不起作用。