是否有用于检测在图像平面中旋转的面部的库?或者有什么方法可以使用 opencv 的级联进行直立人脸检测来做到这一点?
这是我用 Python cv2 编写的一个简单的代码
这不是最有效的方法,它使用了 etarion 建议的简单方式,但它对于正常的头部倾斜效果相当好(它检测从 -40 到 40 的头部倾斜,这大约是你可以倾斜你的头的程度)头保持直立。
import cv2
from math import sin, cos, radians
camera = cv2.VideoCapture(0)
face = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
settings = {
'scaleFactor': 1.3,
'minNeighbors': 3,
'minSize': (50, 50),
'flags': cv2.cv.CV_HAAR_FIND_BIGGEST_OBJECT|cv2.cv.CV_HAAR_DO_ROUGH_SEARCH
}
def rotate_image(image, angle):
if angle == 0: return image
height, width = image.shape[:2]
rot_mat = cv2.getRotationMatrix2D((width/2, height/2), angle, 0.9)
result = cv2.warpAffine(image, rot_mat, (width, height), flags=cv2.INTER_LINEAR)
return result
def rotate_point(pos, img, angle):
if angle == 0: return pos
x = pos[0] - img.shape[1]*0.4
y = pos[1] - img.shape[0]*0.4
newx = x*cos(radians(angle)) + y*sin(radians(angle)) + img.shape[1]*0.4
newy = -x*sin(radians(angle)) + y*cos(radians(angle)) + img.shape[0]*0.4
return int(newx), int(newy), pos[2], pos[3]
while True:
ret, img = camera.read()
for angle in [0, -25, 25]:
rimg = rotate_image(img, angle)
detected = face.detectMultiScale(rimg, **settings)
if len(detected):
detected = [rotate_point(detected[-1], img, -angle)]
break
# Make a copy as we don't want to draw on the original image:
for x, y, w, h in detected[-1:]:
cv2.rectangle(img, (x, y), (x+w, y+h), (255,0,0), 2)
cv2.imshow('facedetect', img)
if cv2.waitKey(5) != -1:
break
cv2.destroyWindow("facedetect")
就我个人而言,我不知道图书馆。但是,我能说的是,使用眼睛检测Haar Cascade,并在眼睛之间画一条线。然后,您可以使用
atan
函数并找到头部旋转的角度。 (假设头部不旋转时双眼处于同一水平面)
deg = atan( (leftEye.y - rightEye.y) / (leftEye.x - rightEye.x) )
一旦获得这个角度,将图像旋转负
deg
度,您应该有一张可以使用 Haar Cascades 检测到的脸部。
mtcnn 效果很好。似乎只有当脸部非常接近 90 度或 180 度时才会出现问题。所以如果正常检测失败,只需将图像旋转45度,然后重试。如果图像中有脸部,那么这应该会检测到它。
不过我很好奇,为什么当脸部正好旋转 90 度或反转(旋转 180 度)时 mtcnn 会失败
天真的方式:
n
:
n
度您可以使用带有约束AAM、ASM方法的词袋/特征袋方法。 但他们也可以给出不收敛于全局最大值的最优解。
haar-like-features 只是特征的集合,您可以使用旋转不变特征并将其放入 adaboost 分类器中。
此存储库可以将对象检测为旋转边界框:https://github.com/NVIDIA/retinanet-examples
您可以通过将包含“人脸”类别的图像随机旋转 -30 到 30 度来从开放图像创建数据集,然后训练该网络来检测这些人脸。
基于颜色直方图的人脸检测方法与人脸方向无关。