当前位置:   article > 正文

python+opencv 实现人脸识别及追踪_opencv人脸追踪

opencv人脸追踪

通过python+opencv实现图片人脸识别,视频人脸识别及追踪。

壹:图片人脸识别

  1. import cv2
  2. # 加载特征文件
  3. face_detector = cv2.CascadeClassifier('E:/Python/opencv-3.4.1/data/haarcascades/haarcascade_frontalface_default.xml')
  4. # 读取人脸图片
  5. face_im = cv2.imread('../img/work/face02.png')
  6. # print(face_im.shape) # 这个print可以检验读入图片是否正确
  7. # 灰度转换
  8. grey = cv2.cvtColor(face_im, cv2.COLOR_BGR2GRAY)
  9. # 检测人脸
  10. faces = face_detector.detectMultiScale(grey)
  11. # 遍历人脸
  12. for x, y, w, h in faces:
  13. print(x,y,w,h)
  14. # 在人脸区域绘制矩形
  15. cv2.rectangle(face_im, (x, y), (x+w, y+h), (0, 255, 0), 5)
  16. cv2.imshow('face', cv2.resize(face_im, (face_im.shape[1]//2, face_im.shape[0]//2)))
  17. cv2.waitKey(0)
  18. cv2.destroyAllWindows()

贰:视频人脸识别及追踪

获取相机捕捉到的第一帧,识别到人脸之后打开相机进行人脸追踪。

  1. """
  2. 人脸识别及追踪
  3. """
  4. import cv2
  5. # 1.创建相机
  6. cap = cv2.VideoCapture(0)
  7. # 加载特征文件
  8. face_detector = cv2.CascadeClassifier('E:/Python/opencv-3.4.1/data/haarcascades/haarcascade_frontalface_default.xml')
  9. # 2.循环读取图片
  10. # 2-1.获取第一帧位置,并指定目标位置
  11. ret,frame = cap.read()
  12. # 2.2检测人脸
  13. # 灰度转换
  14. grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  15. # 检测人脸
  16. faces = face_detector.detectMultiScale(grey)
  17. # print(faces)
  18. x, y, w, h = faces[0]
  19. track_window=(x,y,w,h)
  20. roi = frame[x:x+w,y:y+h]
  21. # print(x,y,w,h)
  22. # 2-3.转换色彩空间
  23. hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
  24. # 计算直方图
  25. roi_hist = cv2.calcHist([hsv_roi], [0], None, [180], [0, 180])
  26. # 归一化
  27. cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
  28. # 2-4.目标追踪
  29. # 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
  30. term_crit = (cv2.TermCriteria_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
  31. while True:
  32. ret,frame = cap.read()
  33. # 正常读取
  34. if ret:
  35. # 计算直方图的反向投影
  36. hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
  37. dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
  38. # 进行meanshift追踪
  39. ret, track_window = cv2.meanShift(dst, track_window, term_crit)
  40. # 将追踪的位置绘制在视频上,并进行显示
  41. x, y, w, h = track_window
  42. img = cv2.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
  43. cv2.imshow("frame", img)
  44. def mouse_callback(event, x, y, flags, userdata):
  45. # 0 218 252 0 123
  46. # print(event, x, y, flags, userdata)
  47. pass # 占位符,写鼠标点击代码
  48. # 设置鼠标回调函数
  49. cv2.setMouseCallback('frame', mouse_callback, '123')
  50. if cv2.waitKey(10) & 0xFF == ord('q'):
  51. break
  52. # 读取失败退出
  53. else:
  54. break
  55. # 3.资源释放
  56. cap.release()
  57. cv2.destroyAllWindows()

问题1:相机第一帧没有捕捉到人脸怎么办?

答:这个还望大神指教,我自己写了一个函数:调用相机,当没有发现人脸,则重复读取,结果总是会出现一些奇奇怪怪的bug,例如:人脸闪的比较快的时候,读取到的位置就会不准确。这是由于后续追踪不是追踪人脸,而是追踪第一帧读取到人脸的坐标。

  1. def read_img():
  2. while True:
  3. ret, frame = cap.read()
  4. grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  5. # # 检测人脸
  6. faces = face_detector.detectMultiScale(grey)
  7. if faces!=():
  8. x, y, w, h = faces[0]
  9. print(x, y, w, h)
  10. if w*h<100*100:
  11. continue
  12. else:
  13. track_window = (x, y, w, h)
  14. roi = frame[x:x + w, y:y + h]
  15. return roi, track_window
  16. break

opencv特征文件获取:

方式一:参考博文Python 实现人脸追踪_跟踪人物并放大 python csdn-CSDN博客

方式二:找我帮忙(虽然我不一定能解决,但三人行,必有我师焉,则其善者而从之,其不善者而改之。巫医乐师百工之人不耻相师)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/875656
推荐阅读
相关标签
  

闽ICP备14008679号