人脸检测 FaceDetection Python openCV

阳光辉
2023-12-01

·```
import cv2

def StaticDetect(filename):
‘’’
静态图像的人脸检测
‘’’
# 创建一个级联分类器,加载一个 .xml文件,它既可以是Haar特征,也可以是LBP特征的分类器
face_casecade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)

# 加载图像
img = cv2.imread(filename, cv2.IMREAD_COLOR)
# 转换为灰度图像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
'''
detectMultiScale进行人脸检测
传入参数为args:
                img:传入图像
                object:被检测的物体的矩形框向量组
                scaleFactor:表示前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1,即每次搜索窗口扩大10%
                minNegihbors,表示构成检测目标的相邻矩形的最小个数(默认为3个)
                flags:要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数会使用Canny边缘检测来排除边缘过多或者过少的区域,这些通常不会是人脸所在区域
                minSize和maxSize:用来限制得到的目标区域的范围
输出为:vector保存各个人脸的坐标、大小(用矩形表示)
'''
faces = face_casecade.detectMultiScale(gray_img, 1.2, 5)
for (x, y, w, h) in faces:
    # 在原图上绘制矩形
    img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.namedWindow('Face_Detected')
cv2.imshow('Face_Detected', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

def detect(filename):
# cv2级联分类器CascadeClassifier,xml文件为训练数据
face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
# 读取图片
img = cv2.imread(filename)
# 转灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行人脸检测
faces = face_cascade.detectMultiScale(gray, 1.8, 5)
# 绘制人脸矩形框
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 命名显示窗口
cv2.namedWindow(‘people’)
# 显示图片
cv2.imshow(‘people’, img)
# 保存图片
cv2.imwrite(‘cxks.png’, img)
# 设置显示时间,0表示一直显示
cv2.waitKey(0)

def face_rec():
# 加载视频

# cameraCapture = cv2.VideoCapture(0)
cameraCapture = cv2.VideoCapture("video.mp4")

# cv2级联分类器CascadeClassifier,xml文件为训练数据
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 读取数据
success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1:
    # 读取数据
    ret, img = cameraCapture.read()
    # 进行人脸检测
    # 1.image表示的是要检测的输入图像
    # 2.objects表示检测到的人脸目标序列
    # 3.scaleFactor表示每次图像尺寸减小的比例
    # 4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
    # 5.minSize为目标的最小尺寸
    # 6.minSize为目标的最大尺寸
    faces = face_cascade.detectMultiScale(img, 1.3, 1, cv2.CASCADE_FIND_BIGGEST_OBJECT, (500, 500), (1000, 1000))
    if len(faces) > 0:
        print("have body")
    # 绘制矩形框
    for (x, y, w, h) in faces:
        img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
    # 设置显示窗口
    cv2.namedWindow('camera', 0)
    cv2.resizeWindow('camera', 840, 480)
    # 显示处理后的视频
    cv2.imshow('camera', img)
    # 读取数据
    success, frame = cameraCapture.read()
# 释放视频
cameraCapture.release()
# 释放所有窗口
cv2.destroyAllWindows()

def face_rec_video():
# 加载视频
cameraCapture = cv2.VideoCapture(0)

# cv2级联分类器CascadeClassifier,xml文件为训练数据
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 读取数据
success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1:
    # 读取数据
    ret, img = cameraCapture.read()
    # 进行人脸检测
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.1, 8)
    # 绘制矩形框
    for (x, y, w, h) in faces:
        img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
    # 设置显示窗口
    cv2.namedWindow('camera', 0)
    cv2.resizeWindow('camera', 840, 480)
    # 显示处理后的视频
    cv2.imshow('camera', img)
    # 读取数据
    success, frame = cameraCapture.read()
# 释放视频
cameraCapture.release()
# 释放所有窗口
cv2.destroyAllWindows()

打开摄像头的方法,window_name为显示窗口名,video_id为你设备摄像头的id,默认为0或-1,如果引用usb可能会改变为1,等

def openvideo(window_name, video_id):
cv2.namedWindow(window_name) # 创建一个窗口

cap = cv2.VideoCapture(video_id)  # 获取摄像头
while cap.isOpened():
    ok, frame = cap.read()  # ok表示摄像头读取状态,frame表示摄像头读取的图像
    if not ok:
        break

    cv2.imshow(window_name, frame)  # 将图像矩阵显示在一个窗口中
    c = cv2.waitKey(25)  # 等待10ms,10ms内没有按键操作就进入下一次while循环,从而得到10ms一帧的效果,waitKey返回在键盘上按的键
    if c & 0xFF == ord('q'):  # 按键q后break
        break

# 释放资源
cap.release()
cv2.destroyWindow(window_name)
print("cam closed")

if name == ‘main’:
# openvideo(‘mycam’, 0)
# face_rec()
face_rec_video()

 类似资料: