В приведенном ниже коде я пытаюсь вывести одно лицо (обрезанное из большего изображения) с CV2:
def machine_pst():
mlimg = request.files.get("mlimg")
fname = mlimg.filename
filepath = "/home/assets/faces/"
mlimg.save(filepath + fname, overwrite = True)
full_path = filepath + fname
cascPath = "/home/assets/haarcascade_frontalface_default.xml"
detector = cv2.CascadeClassifier(cascPath)
faceSamples=[]
pilImage=Image.open(full_path).convert('L')
imageNp=np.array(pilImage,'uint8')
faces=detector.detectMultiScale(imageNp)
for (x,y,w,h) in faces:
faceSamples.append(imageNp[y:y+h,x:x+w])
img = Image.fromarray(faceSamples[0], 'RGB')
cv2.imwrite("/home/assets/faces/read.png", img)
source = "/static/faces/read.png"
return template("home/machineout", source = source)
с source , передаваемым в качестве параметра в imgsrc = "{{source}}
Если я верну длину граней в изображении с 3 гранями, я получу" 3 ", так что это, кажется, работает хорошо, и если я возвращаю какой-либо индекс faceSamples (например,faceSamples [0]), я также получаю данные, которые возвращаются, но когда я пытаюсь превратить этот образец лица в изображение, используя ...
img = Image.fromarray(faceSamples[0], 'RGB')
, я получаю ValueError, что "недостаточно данных изображения«
Я понимаю (из предыдущего ответа), что DetectMultiScale возвращает прямоугольники, а не изображения, но с моим дополнительным кодом Numpy, это все еще так? Я все еще не до конца понимаю, что возвращает массив faceSamples?это не может быть непосредственно превращено обратно в RGB-изображение с последним фрагментом кода?