用cv2代替HOG成像



嗨,我正在研究面部识别。

为了提高性能,我想使用面部对齐。

当我使用HOG人脸识别器时,例如Adrian所描述的,我会得到一个对齐的图像。

from imutils.face_utils import rect_to_bb
from dlib import get_frontal_face_detector
detector = dlib.get_frontal_face_detector()
shape_predictor = dlib.shape_predictor('/home/base/Documents/facial_landmarks/shape_predictor_5_face_landmarks.dat')
fa = face_utils.facealigner.FaceAligner(shape_predictor, desiredFaceWidth=112, desiredLeftEye=(0.3, 0.3))
img=cv2.imread(pathtoimage)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
rects = detector(gray, 2)  
for rect in rects:                
(x, y, w, h) = rect_to_bb(rect)
faceAligned = fa.align(img, gray, rect)

然而,我必须在嵌入式硬件上工作,HOG面部识别不够快。最好的工作是cv2 lbpcascader。

使用cv2,我也可以得到找到的人脸的框,但使用它不起作用。

faces_detected = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=4) 

在使用HOG的其他示例中,坐标从HOG矩形中提取,使用:

(x, y, w, h) = rect_to_bb(rect)

然后与一起使用

aligned_face = fa.align(img, gray, dlib.rectangle(left = x, top=y, right=w, bottom=h))

其想法是将x、y、w、h与cv2值进行交换。不幸的是,这不起作用,因为上面的两行导致了完全错误的对齐。在第一个代码示例中,包含但未使用rect_to_bb函数。

我检查了这些值,它们不知何故偏离了:

  • 224x224图像
  • 156 70 219 219 cv2值(当然略有不同(
  • 165 101 193 193具有rect_to_bb的rect值
  • [(165101((358294(]矩形值

我检查了rect_to_bb函数,但这似乎很直接:

def rect_to_bb(rect):
# take a bounding predicted by dlib and convert it
# to the format (x, y, w, h) as we would normally do
# with OpenCV
x = rect.left()
y = rect.top()
w = rect.right() - x
h = rect.bottom() - y
# return a tuple of (x, y, w, h)
return (x, y, w, h)

打字时我得到了答案。。。经典

对齐功能需要边界框标记略有不同。它可以在rect_to_bb()函数中看到。

def rect_to_bb(rect):
# take a bounding predicted by dlib and convert it
# to the format (x, y, w, h) as we would normally do
# with OpenCV
x = rect.left()
y = rect.top()
w = rect.right() - x
h = rect.bottom() - y
# return a tuple of (x, y, w, h)
return (x, y, w, h)

在这里,rect.right(在cv2中为w(和rect.bottom(在cv2中为h(与x和y相减。因此,在对齐函数中,您必须添加这些值,否则,提供给对齐函数的图像会变得太小,变形。这也可以是来自cv2检测的值。

aligned_face = fa.align(img, gray, dlib.rectangle(left = x, top=y, right=w+x, bottom=h+y))

保持健康

相关内容

  • 没有找到相关文章

最新更新