在下面的代码中,我尝试使用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图像吗?
答案 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功能更加兼容。