将检测到的OpenCV人脸复制到新图像

时间:2019-12-20 01:16:34

标签: python-3.x opencv

我写了一些代码来检测报纸图像中的人脸。我试图遍历这些找到的面孔的列表,从图像中复制它们并将它们粘贴到新图像中。

新图像的文件名将位于顶部,然后是面部马赛克。下面的代码段实际上是一个循环的遍历多个图像的循环。我希望所有新的镶嵌图像最终都成为一个大图像。

这是我的代码:

pil_img = Image.open(imgfile)
opencvImage = cv.cvtColor(np.array(pil_img), cv.COLOR_RGB2BGR)
gray = cv.cvtColor(opencvImage, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(opencvImage, scaleFactor=1.4, minNeighbors=4, minSize=(30,30))
my_faces = []
for x,y,w,h in faces:
    drawing.rectangle((x,y,x+w,y+h), outline="white")
my_faces.append((x,x+w,y,y+h))
for face in my_faces:
            print(face)
                # roi = i[face[0]:face[1], face[2]:face[3]]
                # cv.imshow('ROI',face)
                # cv.waitKey(0)
            contact_sheet=Image.new('RGB', (600,300))
            contact_sheet.show()
            pil_img.show()

激活时,这些行通过以下错误消息将其注释掉:

TypeError: 'Image' object is not subscriptable

我真正想做的是将这些面孔粘贴到新的contact_sheet中。

感谢您对我的帮助!

1 个答案:

答案 0 :(得分:1)

您可以在for循环中编写它们

index = 0
for x,y,w,h in faces:
    cv.imwrite(f'face_{index}.jpg', opencvImage[y:(y+h), x:(x+w), :])
    index += 1

要从单独的图像创建蒙太奇,可以使用feh(如果已安装):

feh -m -O montage.png *.jpg

您还可以在纯opencv中创建蒙太奇,为此,我建议您首先将面孔调整为统一大小,然后再将其串联:

face_imgs = []
for x,y,w,h in faces:
    face = opencvImage[y:(y+h), x:(x+w), :]
    thumbnail = cv2.resize(face, (100, 100))
    face_imgs.append(thumbnail)
faces = np.concatenate(face_imgs, axis=0)