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

目录

识别人脸

 读取.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)将关键点标在图片上(这种方法有误差,因为坐标点必须是整数)

 

人脸识别是计算机视觉领域中的一个重要问题,特征提取是其中的一个关键步骤。这里给出一个使用OpenCV库实现人脸识别中特征提取的简单示例代码,具体实现如下: ```c++ #include <opencv2/opencv.hpp> #include <opencv2/face.hpp> #include <iostream> #include <vector> #include <string> using namespace cv; using namespace cv::face; using namespace std; // 特征提取函数 void featureExtraction(const string& filename) { // 读取图像 Mat img = imread(filename, IMREAD_GRAYSCALE); // 初始化人脸检测器和特征提取器 CascadeClassifier faceDetector("/path/to/haarcascade_frontalface_alt.xml"); Ptr<FacemarkLBF> facemark = FacemarkLBF::create(); facemark->loadModel("/path/to/lbfmodel.yaml"); // 检测人脸 vector<Rect> faces; faceDetector.detectMultiScale(img, faces); // 提取特征 vector<vector<Point2f>> landmarks; bool success = facemark->fit(img, faces, landmarks); if (success) { // 对每个人脸进行处理 for (int i = 0; i < landmarks.size(); i++) { // 获取人脸关键点坐标 vector<Point2f> pts = landmarks[i]; // TODO: 根据关键点坐标进行特征提取 // ... } } } int main() { // 图像文件名 string filename = "/path/to/image.jpg"; // 特征提取 featureExtraction(filename); return 0; } ``` 在这个代码中,我们使用了OpenCV库中的人脸检测器和特征提取器,分别是`CascadeClassifier`和`FacemarkLBF`。其中,`CascadeClassifier`用于检测人脸,`FacemarkLBF`用于提取人脸关键点坐标。在特征提取函数中,我们对每个人脸进行处理,获取其关键点坐标,然后根据这些坐标进行特征提取。具体的特征提取方法可以根据具体应用进行选择和实现。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值