我正在尝试检测一张脸并在一个单独的文件中记下脸部区域。 我该怎么做?我认为我必须使用“faces”(你可以在代码中看到这个var)。但是如何?
from ffnet import mlgraph, ffnet, tmlgraph, imlgraph
import pylab
import sys
import cv,cv2
import numpy
cascade = cv.Load('C:\opencv\data\haarcascades\haarcascade_frontalface_alt.xml')
def detect(image):
bitmap = cv.fromarray(image)
faces = cv.HaarDetectObjects(bitmap, cascade, cv.CreateMemStorage(0))
if faces:
for (x,y,w,h),n in faces:
cv2.rectangle(image,(x,y),(x+w,y+h),(255,255,255),3)
return image
if __name__ == "__main__":
cam = cv2.VideoCapture(0)
while 1:
_,frame =cam.read()
frame = numpy.asarray(detect(frame))
cv2.imshow("features", frame)
if cv2.waitKey(1) == 0x1b: # ESC
print 'ESC pressed. Exiting ...'
break
答案 0 :(得分:29)
以下代码应提取图像中的面部并将面部保存在磁盘上
def detect(image):
image_faces = []
bitmap = cv.fromarray(image)
faces = cv.HaarDetectObjects(bitmap, cascade, cv.CreateMemStorage(0))
if faces:
for (x,y,w,h),n in faces:
image_faces.append(image[y:(y+h), x:(x+w)])
#cv2.rectangle(image,(x,y),(x+w,y+h),(255,255,255),3)
return image_faces
if __name__ == "__main__":
cam = cv2.VideoCapture(0)
while 1:
_,frame =cam.read()
image_faces = []
image_faces = detect(frame)
for i, face in enumerate(image_faces):
cv2.imwrite("face-" + str(i) + ".jpg", face)
#cv2.imshow("features", frame)
if cv2.waitKey(1) == 0x1b: # ESC
print 'ESC pressed. Exiting ...'
break
答案 1 :(得分:1)
或者,借助MTCNN和OpenCV(还需要包括TensorFlow的其他依赖项),您可以:
1 执行面部检测(输入图像,输出检测到的面部的所有框):
from mtcnn.mtcnn import MTCNN
import cv2
face_detector = MTCNN()
img = cv2.imread("Anthony_Hopkins_0001.jpg")
detect_boxes = face_detector.detect_faces(img)
print(detect_boxes)
[{'box':[73,69,98,123],'confidence':0.9996458292007446,'keypoints':{'left_eye':(102,116),'right_eye':(150,114), 'nose':(129,142),'mouth_left':(112,168),'mouth_right':(146,167)}}]
2 将所有检测到的脸部保存到单独的文件中:
for i in range(len(detect_boxes)):
face_img = img[detect_boxes[i]["box"][1]:detect_boxes[i]["box"][1] + detect_boxes[i]["box"][3], detect_boxes[i]["box"][0]:detect_boxes[i]["box"][0] + detect_boxes[i]["box"][2]]
cv2.imwrite("face-%.3d.jpg" % (i+1), face_img)
3或绘制矩形:检测到的所有脸部
for box in detect_boxes:
pt1 = (box["box"][0], box["box"][1]) # top left
pt2 = (box["box"][0] + box["box"][2], box["box"][1] + box["box"][3]) # bottom right
cv2.rectangle(img, pt1, pt2, (0,255,0), 2)
cv2.imwrite("detected-boxes.jpg", img)
答案 2 :(得分:0)
wtluo,太好了! 我可以对您的代码2进行一点修改吗?在这里:
for i, detected_box in enumerate(detect_boxes):
box = detected_box["box"]
face_img = img[ box[1]:box[1] + box[3], box[0]:box[0] + box[2] ]
cv2.imwrite("face-{:03d}.jpg".format(i+1), face_img)