Python 使用opencv从图片中裁剪多个面并将其存储在文件夹中
我是opencv的初学者,我曾尝试在我的项目中从图片中裁剪出一张脸,但无法从图片中裁剪出所有的脸。 如何检测所有面并将其裁剪到文件夹中? 从输入文件夹中获取图像,并将裁剪后的图像发布到输出文件夹Python 使用opencv从图片中裁剪多个面并将其存储在文件夹中,python,numpy,opencv,ubuntu,face-detection,Python,Numpy,Opencv,Ubuntu,Face Detection,我是opencv的初学者,我曾尝试在我的项目中从图片中裁剪出一张脸,但无法从图片中裁剪出所有的脸。 如何检测所有面并将其裁剪到文件夹中? 从输入文件夹中获取图像,并将裁剪后的图像发布到输出文件夹 import numpy as np import cv2 import os, os.path #multiple cascades: https://github.com/Itseez/opencv/tree/master/data/haarcascades #https://github.co
import numpy as np
import cv2
import os, os.path
#multiple cascades: https://github.com/Itseez/opencv/tree/master/data/haarcascades
#https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
face_cascade = cv2.CascadeClassifier('faces.xml')
#https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_eye.xml
eye_cascade = cv2.CascadeClassifier('eye.xml')
DIR = 'input'
numPics = len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))])
for pic in range(1, (numPics+1)):
img = cv2.imread('input/'+str(pic)+'.jpg')
height = img.shape[0]
width = img.shape[1]
size = height * width
if size > (500^2):
r = 500.0 / img.shape[1]
dim = (500, int(img.shape[0] * r))
img2 = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
img = img2
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
eyesn = 0
for (x,y,w,h) in faces:
imgCrop = img[y:y+h,x:x+w]
#cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
#cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
eyesn = eyesn +1
if eyesn >= 2:
cv2.imwrite("output/crop"+str(pic)+".jpg", imgCrop)
#cv2.imshow('img',imgCrop)
print("Image"+str(pic)+" has been processed and cropped")
k = cv2.waitKey(30) & 0xff
if k == 27:
break
#cap.release()
print("All images have been processed!!!")
cv2.destroyAllWindows()
cv2.destroyAllWindows()
如何从图片中裁剪出所有面以保存在文件夹中?您说过您尝试使用单面。你成功了吗?执行给定代码后出现的错误是什么?Yep!当我给一张一个人站在墙上的照片时,它检测到了这张脸,并将其裁剪后发布到输出文件夹。但当我给一张两个人站着的照片时,它剪下了一个人的脸并发布到输出文件夹。如果我给一张10个人的照片(脸足够清晰(高清质量)),但他们的脸仍然无法识别:(@消音器这一切都要看情况而定,可能是面部遮挡、歪斜或光线不好。要获得更准确的结果,你应该选择CNN,但这是另一个主题。你能帮我做一个妈妈吗?@消音器这不是一个容易的工作,需要更多的背景,如keras/tensorflow/CNN/DNN等等。Dlib可能是一个选择,OpenFace可能有帮助,请参阅TaFace maybe工作。VGFace也很受欢迎。最精确的可能是Tinyface,但需要花费时间。@Kinght金 请帮我解决这个问题
#### the counter
cnt = 0
for pic in range(1, (numPics+1)):
img = cv2.imread('input/'+str(pic)+'.jpg')
height = img.shape[0]
width = img.shape[1]
size = height * width
if size > (500^2):
r = 500.0 / img.shape[1]
dim = (500, int(img.shape[0] * r))
img2 = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
img = img2
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
eyesn = 0
imgCrop = img[y:y+h,x:x+w]
#cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
#cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
eyesn = eyesn +1
if eyesn >= 2:
#### increase the counter and save
cnt +=1
cv2.imwrite("output/crop{}_{}.jpg".format(pic, cnt), imgCrop)
#cv2.imshow('img',imgCrop)
print("Image"+str(pic)+" has been processed and cropped")
k = cv2.waitKey(100) & 0xff
if k == 27:
break
#cap.release()
print("All images have been processed!!!")
cv2.destroyAllWindows()
cv2.destroyAllWindows()