人脸识别 以及  读取.pts文件

本文介绍了使用OpenCV进行人脸检测的方法,并展示了如何从图像中读取并标记人脸关键点坐标,包括读取图像、识别人脸、绘制矩形框及关键点定位等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

识别人脸

 读取.pts文件


  • 识别人脸

#  读取图像
import cv2

image = cv2.imread('../faceDetect/FGNET/images/001A02.JPG',1)  # 1 为彩色图像 ; 0为灰色图像
print("image=",image)  

#  显示图像
cv2.namedWindow("orignal")
cv2.imshow("orignal",image)
# print(image.shape)        # (324, 450, 3)
# print(type(image.shape))
# print(image.shape[2])  # 3
cv2.waitKey(0)   # 程序等待,否则会一闪而过

# 识别人脸
cascPath = '../../../../Anaconda3/anaconda3/lib/site-packages/cv2/data/haarcascade_frontalface_default.xml'
face_patterns = cv2.CascadeClassifier(cascPath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_patterns.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(100, 100)) # 检测有多少张人脸
# 该函数返回四个值:矩形的 x 和 y 坐标,以及它的高和宽。
for (x, y, w, h) in faces:  # 把每张脸都用一个框框出来
    # print(x,y,w,h)  # 64 110 200 200
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('after', image)
cv2.waitKey(0)   # 程序等待,否则会一闪而过

cv2.destroyAllWindows()

cv2.rectangle()方法用于在任何图像上绘制矩形。

用法: cv2.rectangle(image, start_point, end_point, color, thickness)
参数:
image:它是要在其上绘制矩形的图像。
start_point:它是矩形的起始坐标。坐标表示为两个值的元组,即(X坐标值,Y坐标值)。
end_point:它是矩形的结束坐标。坐标表示为两个值的元组,即(X坐标值ÿ坐标值)。
color:它是要绘制的矩形的边界线的颜色。opencv中,颜色通道按顺序为BGR,对于BGR,我们通过一个元组。例如:(255,0,0)为蓝色。
thickness:它是矩形边框线的粗细像素。厚度-1像素将以指定的颜色填充矩形形状。

返回值:它返回一个图像。

 另外,重新说一下,cv2.rectangle 的 start_point和end_point参数分别代表矩形的左上角和右下角两个点,而且 x 坐标轴是水平方向的,y 坐标轴是垂直方向的。

  •  读取.pts文件

 在FGNET中,已经给出了每张人脸的关键点坐标,在做练习时,可以直接使用这些关键点进行练习,但是我觉得这些数据直接使用有些不方便,需要做一下处理。

# 读取图片
import cv2
import matplotlib.pyplot as plt
import numpy as np
image = cv2.imread('../faceDetect/FGNET/images/015A03.JPG', 1)  # 1 彩色,0 灰色

# 读取对应的pts文件
with open('../faceDetect/FGNET/points/015a03.pts') as file_obj:
    contents = file_obj.readlines();

i = 0
landmarks = []
for line in contents:
    TT = line.strip("\n")  # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
    if i > 2 and i < 71:
        # print TT
        TT_temp = TT.split(" ")
        x = float(TT_temp[0])
        y = float(TT_temp[1].strip("\r"))  # \r :回车
        landmarks.append((x, y))
    i += 1
print(landmarks)
# print(landmarks[1])  # (83.8168, 220.22)
# # 测试读出的点有多少个
# c=0
# for b in landmarks:
#     c+=1;
# print(c) #68


#  将关键点标在图片上
'''
cv2.circle(image, center_coordinates, radius, color, thickness)
'''
m = 0  # 标号初始为0
for point in landmarks:
    # print(point[0],point[1])
    cv2.circle(image, (int(point[0]), int(point[1])), 2, (0, 255, 0), -1)  # 颜色顺序:BGR (0, 255, 0)绿色,-1 实心圆
    m += 1
    cv2.putText(image, str(m), (int(point[0]), int(point[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.25, (0, 0, 255),
                1)  # 每个关键点上标号
#     plt.scatter(np.transpose(point)[0], np.transpose(point)[1])  # 散点图
# plt.show()
cv2.imshow("pointImg", image)
cv2.waitKey()

(1)读取图片关键点坐标

(2)将关键点标在图片上(这种方法有误差,因为坐标点必须是整数)

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值