【发布时间】:2015-03-13 10:02:11
【问题描述】:
我正在尝试使用带有 Haar Cascade 分类的 Lucas Kanade 算法进行人脸跟踪。 Lucas Kanade 是成功的,可以跟踪用户,但不幸的是,一些检测点的好功能被浪费在了后台的角落。我希望使用 Haar Cascade 的能力来检测事实以获取检测到的面部坐标并将 Lucas Kanade 应用于该限制区域内。
基本上,我想使用 Haar Cascade 来检测事实,获取 x、y、w 和 h 值,并使用这些坐标在该限制区域内应用 Lucas Kanade(这样就不会浪费在为背景和仅检测面部特征)
执行 Lucas Kanade 算法的代码行是这样的代码:
p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params)
我该怎么做?
代码:
from matplotlib import pyplot as plt
import numpy as np
import cv2
rectangle_x = 0
face_classifier = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
# params for ShiTomasi corner detection
feature_params = dict( maxCorners = 200,
qualityLevel = 0.01,
minDistance = 10,
blockSize = 7 )
# Parameters for lucas kanade optical flow
lk_params = dict( winSize = (15,15),
maxLevel = 2,
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
# Create some random colors
color = np.random.randint(0,255,(100,3))
# Take first frame and find corners in it
ret, old_frame = cap.read()
cv2.imshow('Old_Frame', old_frame)
cv2.waitKey(0)
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
restart = True
face = face_classifier.detectMultiScale(old_gray, 1.2, 4)
if len(face) == 0:
print "This is empty"
for (x,y,w,h) in face:
focused_face = old_frame[y: y+h, x: x+w]
cv2.imshow('Old_Frame', old_frame)
face_gray = cv2.cvtColor(old_frame,cv2.COLOR_BGR2GRAY)
gray = cv2.cvtColor(focused_face,cv2.COLOR_BGR2GRAY)
corners_t = cv2.goodFeaturesToTrack(gray, mask = None, **feature_params)
corners = np.int0(corners_t)
for i in corners:
ix,iy = i.ravel()
cv2.circle(focused_face,(ix,iy),3,255,-1)
cv2.circle(old_frame,(x+ix,y+iy),3,255,-1)
print ix, " ", iy
plt.imshow(old_frame),plt.show()
##########
#############################
p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params)
#############################
# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)
print "X: ", x
print "Y: ", y
while(1):
ret,frame = cap.read()
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# calculate optical flow
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)
# Select good points
good_new = p1[st==1]
good_old = p0[st==1]
# draw the circles
for i,(new,old) in enumerate(zip(good_new,good_old)):
a,b = new.ravel()
c,d = old.ravel()
cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
if i == 99:
break
cv2.imshow('frame',frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
# Now update the previous frame and previous points
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1,1,2)
cv2.destroyAllWindows()
cap.release()
【问题讨论】:
-
如果目标是获取面部特征 - 为什么不使用像 flandmark 这样的库 - cmp.felk.cvut.cz/~uricamic/flandmark/index.php ?有什么理由更喜欢 Haar+LK 吗?
-
一个原因是我用 Python 编写它,我什至不知道它是否有能力。也是因为我这样做是一种学习体验,我不希望图书馆为我做这件事。
-
而不是
mask = None,只需在您检测到人脸的区域使用蒙版...例如mask = 为您在与输入图像(单通道)大小相同的黑色图像上检测到的每个人脸绘制一个白色矩形。 -
它的语法是什么?我无法使用检测到的面部坐标分配 mask 属性(我不断收到错误)
标签: opencv coordinates feature-selection haar-classifier opencv3.0