将CV2 numpy数组转换为RGB图像时出现“图像数据不足”错误

时间:2019-01-28 16:25:50

标签: python arrays numpy opencv cv2

在下面的代码中,我尝试使用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 作为参数传递到img src =“ {{source}}

如果我在具有3张脸的图像中返回脸的长度,则得到“ 3”,这似乎很好用,并且如果我返回faceSamples的任何索引(例如faceSamples [0]),我将得到的数据返回为很好,但是当我尝试使用...将脸部样本转换为图像时。

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

我收到ValueError提示“没有足够的图像数据”

我理解(从先前的答案中得出)detectMultiScale返回矩形,而不是图像,但是使用我的其他Numpy代码,情况仍然如此吗?我是否仍不完全了解faceSamples数组返回什么?不能直接将最后一小段代码转换回RGB图像吗?

1 个答案:

答案 0 :(得分:1)

您的问题在这里:

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功能更加兼容。