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中。
感谢你们对我的帮助!
解决方案
你可以把它们写在你的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)
推荐阅读
- spring - ControllerAdvice 不处理 AfterThrowing 方面抛出的异常
- julia - 如何通过从命令行执行文件来显示绘图
- yii2 - 使用 Yii2 TimestampBehavior 返回 'created_at' 没有默认值错误
- r - 在R中将字符串转换为日期格式
- python-3.x - 在 RTL 语言风格中,Psychopy 字符空间不相等
- r - 如何仅对具有相同值的序列进行分组
- java - 如何在 HTTP POST/GET 中发送空参数
- javascript - Javascript 函数不能正常工作。无法将属性“onclick”设置为 null
- node.js - Express.js 页面刷新两次打印内容两次
- android - Android“泄漏上下文”错误