Ошибка «Недостаточно данных изображения» при преобразовании массива CV2 Numpy в RGB-изображение - PullRequest
0 голосов
/ 28 января 2019

В приведенном ниже коде я пытаюсь вывести одно лицо (обрезанное из большего изображения) с 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-изображение с последним фрагментом кода?

1 Ответ

0 голосов
/ 28 января 2019

Ваша проблема здесь:

pilImage=Image.open(full_path).convert('L')
imageNp=np.array(pilImage,'uint8')

То есть вы преобразовали imageNp в одноканальное серое изображение.Тогда не имеет смысла делать

img = Image.fromarray(faceSamples[0], 'RGB')

, поскольку faceSamples[0] также является серым изображением.

Также, как и комментарий @ MarkSetchell, вы можете использовать cv2.imread и другие функции вместоPIL.Они более совместимы с другими функциями openCV.

...