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

本文介绍了如何通过Python和OpenCV库实现图片人脸识别,包括加载特征文件、检测人脸并绘制矩形,以及在视频中进行人脸识别并进行追踪,包括使用meanShift算法进行目标追踪。作者也分享了解决相机第一帧未检测到人脸问题的方法。
摘要由CSDN通过智能技术生成

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

壹:图片人脸识别

import cv2

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

cv2.destroyAllWindows()

贰:视频人脸识别及追踪

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

"""
人脸识别及追踪
"""
import cv2

# 1.创建相机
cap = cv2.VideoCapture(0)
# 加载特征文件
face_detector = cv2.CascadeClassifier('E:/Python/opencv-3.4.1/data/haarcascades/haarcascade_frontalface_default.xml')

# 2.循环读取图片
# 2-1.获取第一帧位置,并指定目标位置
ret,frame = cap.read()

# 2.2检测人脸
# 灰度转换
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_detector.detectMultiScale(grey)
# print(faces)
x, y, w, h = faces[0]
track_window=(x,y,w,h)
roi = frame[x:x+w,y:y+h]
# print(x,y,w,h)

# 2-3.转换色彩空间
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
# 计算直方图
roi_hist = cv2.calcHist([hsv_roi], [0], None, [180], [0, 180])
# 归一化
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)

# 2-4.目标追踪
# 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
term_crit = (cv2.TermCriteria_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

while True:
    ret,frame = cap.read()
    # 正常读取
    if ret:
        # 计算直方图的反向投影
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)

        # 进行meanshift追踪
        ret, track_window = cv2.meanShift(dst, track_window, term_crit)

        # 将追踪的位置绘制在视频上,并进行显示
        x, y, w, h = track_window
        img = cv2.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
        cv2.imshow("frame", img)

        def mouse_callback(event, x, y, flags, userdata):
            # 0 218 252 0 123
            # print(event, x, y, flags, userdata)
            pass # 占位符,写鼠标点击代码

        # 设置鼠标回调函数
        cv2.setMouseCallback('frame', mouse_callback, '123')

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    # 读取失败退出
    else:
        break

# 3.资源释放
cap.release()
cv2.destroyAllWindows()


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

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

def read_img():
    while True:
        ret, frame = cap.read()
        grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # # 检测人脸
        faces = face_detector.detectMultiScale(grey)
        if faces!=():
            x, y, w, h = faces[0]
            print(x, y, w, h)
            if w*h<100*100:
                continue
            else:
                track_window = (x, y, w, h)
                roi = frame[x:x + w, y:y + h]
                return roi, track_window
                break

opencv特征文件获取:

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

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

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值