2026/3/10 2:30:20
网站建设
项目流程
建团购网站,长沙装修公司排名前十名,专业的网站建设价格低,网站建设心得8000字引言前面我们已经基本掌握了OpenCV中的基础知识了#xff0c;本经将继续补充基础人脸检测到复杂视觉分析的全过程#xff0c;学习如何使用OpenCV和dlib等开源库#xff0c;实现包括人脸检测、关键点定位等综合视觉系统。一、人脸检测基础#xff1a;从静态图像开始1、代码结…引言前面我们已经基本掌握了OpenCV中的基础知识了本经将继续补充基础人脸检测到复杂视觉分析的全过程学习如何使用OpenCV和dlib等开源库实现包括人脸检测、关键点定位等综合视觉系统。一、人脸检测基础从静态图像开始1、代码结构与导入导入两个核心库cv2OpenCV开源的计算机视觉库提供丰富的图像处理函数dlib一个现代化的C工具包包含机器学习算法特别在人脸检测和关键点定位方面表现优异。import cv2 import dlib2、HOG人脸检测器原理我们要构建了一个基于方向梯度直方图HOG特征结合线性支持向量机SVM的经典人脸检测器。其检测流程为首先算法通过构建图像金字塔来适应不同大小的人脸接着在金字塔的每一层上一个固定尺寸的检测窗口会遍历整个图像对于每个窗口区域算法会计算其HOG特征该特征通过统计局部梯度的方向分布来刻画物体的形状轮廓最后这些特征向量被送入一个预先训练好的线性SVM分类器进行判别以决定当前窗口是否包含一张人脸。detector dlib.get_frontal_face_detector()3、参数详解img输入图像可以是彩色或灰度图0上采样次数控制检测的灵敏度值越大图像放大倍数越高能检测到更小的人脸但会增加计算一般设置为0或1即可。img cv2.imread(hezhao.png) faces detector(img, 0)4、人脸框处理与可视化在人脸检测完成后我们需要对结果进行遍历处理每个人脸对象face提供了边界框的四个坐标值左、上、右、下。随后调用OpenCV的cv2.rectangle函数根据这些坐标在原图像上绘制绿色矩形框以高亮显示检测到的人脸区域。for face in faces: x1 face.left() # 左边界x坐标 y1 face.top() # 上边界y坐标 x2 face.right() # 右边界x坐标 y2 face.bottom()# 下边界y坐标 cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)5、结果显示与资源释放最后在窗口中显示图像cv2.imshow(result, img) cv2.waitKey(0) cv2.destroyAllWindows()二、实时摄像头人脸检测1、代码结构与导入导入两个核心库cv2和dlibimport cv2 import dlib2、初始化人脸检测器和摄像头通过dlib.get_frontal_face_detector()加载一个预训练好的基于HOG特征和线性分类器的正面人脸检测器该检测器是基于经典的 HOG方向梯度直方图特征描述子与线性 SVM 分类器构建并已通过大量数据预训练完成。同时使用cv2.VideoCapture(0)创建视频捕获对象调用默认摄像头索引0作为实时视频输入源。detector dlib.get_frontal_face_detector() cap cv2.VideoCapture(0)3、主循环 - 实时视频处理首先进入无限循环持续从摄像头捕获视频帧。每读取一帧它首先检查是否成功失败则退出循环。接着使用检测器对当前图像进行人脸定位其中的上采样参数有助于检测更小的人脸。对于每一个检测到的人脸程序获取其边框的像素坐标并使用OpenCV的矩形绘制函数以绿色的线条在原图像上标记出人脸区域从而完成实时视频流中人脸的框选与显示。while True: ret, img cap.read() if not ret: break faces detector(img, 1) for face in faces: x1 face.left() y1 face.top() x2 face.right() y2 face.bottom() cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)4、结果显示与资源释放最后显示结果cv2.imshow(Dlib, img) if cv2.waitKey(1) 27: break cap.release() cv2.destroyAllWindows()三、关键点定位与实时标注1、代码结构与导入导入cv2、dlib和numpy库import numpy as np import cv2 import dlib2、初始化人脸检测器和导入图片img cv2.imread(nan.png) detector dlib.get_frontal_face_detector() faces detector(img,0)3、68点人脸关键点模型1、模型加载加载预训练的68点人脸关键点检测模型模型文件可从dlib-models下载。predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat)2、关键点分布其中人脸有68个关键点的标准划分面部轮廓0-16、双眉17-26、鼻子27-35、双眼36-47以及嘴部48-67。这一结构是许多人脸分析的基础。4、关键点检测与转换首先通过predictor()函数对输入图像和指定的人脸区域进行关键点检测该函数返回一个包含68个面部特征点的shape对象。接着为了便于后续的数值计算和处理将shape对象中的每个dlib点对象转换为二维坐标并使用列表推导式构建一个包含所有点坐标的列表。最后通过NumPy库将该列表转换为一个二维数组从而得到一个结构化的关键点坐标集合。shape predictor(img, face) landmarks np.array([[p.x, p.y] for p in shape.parts()])5、关键点可视化遍历之前得到的关键点坐标数组在原始图像上直观地标注出每个点的位置及其对应的序号。使用绿色、半径为2像素的实心圆形标记每个关键点紧接着在每个点旁边以白色、小号的简洁字体标注其索引数字并采用抗锯齿cv2.LINE_AA绘制方式使文字边缘平滑。for idx, point in enumerate(landmarks): pos [point[0], point[1]] cv2.circle(img, pos, 2, color(0, 255, 0)) cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 255), 1, cv2.LINE_AA)6、结果显示与资源释放最后显示结果cv2.imshow(img,img) cv2.waitKey(0) cv2.destroyAllWindows()四、人脸轮廓绘制与结构化展示1、代码结构与导入导入需要的库import numpy as np import dlib import cv22、定义绘制直线函数在图像上绘制连接一系列连续特征点的直线段。接收起始和结束两个索引值作为参数从预定义的关键点集合shape中提取相应区间的所有点坐标。通过遍历这些点函数将相邻点两两连接使用OpenCV的线段绘制功能以绿色线条在图像上逐段描绘出连续轨迹。def drawLine(start, end): 绘制连续的特征点直线 参数 - start: 起始特征点索引 - end: 结束特征点索引 pts shape[start:end] # 获取从start到end-1的特征点 for l in range(1, len(pts)): ptA tuple(pts[l-1]) # 前一个点 ptB tuple(pts[l]) # 当前点 cv2.line(image, ptA, ptB, (0, 255, 0), 2) # 绘制绿色直线3、定义绘制凸包函数在面部关键点集合中选取特定区间内的点并绘制其凸包轮廓。接收起始和结束两个索引值作为参数首先从预定义的关键点集合shape中提取指定范围内的所有点包含两端点接着通过计算这些点的凸包得到包围它们的最小凸多边形轮廓。最后使用OpenCV的轮廓绘制功能以绿色线条在图像上描绘出该凸包形状从而勾勒出面部的某个局部区域如下巴或嘴巴的外部边界。def drawConvexHull(start, end): 绘制特征点的凸包 参数 - start: 起始特征点索引 - end: 结束特征点索引 Facial shape[start:end 1] # 获取指定范围内的所有特征点 mouthHull cv2.convexHull(Facial) # 计算凸包 cv2.drawContours(image, [mouthHull], -1, (0, 255, 0), 2) # 绘制凸包轮廓4、加载图像和人脸检测首先读取图像将图像数据存储为numpy数组。接着初始化dlib库内置的前向人脸检测器最后将图像输入检测器进行人脸定位。image cv2.imread(renlian4.png) detector dlib.get_frontal_face_detector() faces detector(image,0)5、特征点检测和处理首先加载预训练的68点面部关键点模型文件随后程序遍历之前检测到的每一个人脸区域对每个区域使用预测器计算其68个特征点的精确坐标。最后为了便于后续的数值计算和可视化处理将dlib返回的坐标对象结构转换为一个标准的NumPy二维数组形成一个包含68行、每行对应一个点[x, y]坐标的数据结构。predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) for face in faces: shape predictor(image,face)# 预测特征点 shape np.array([[p.x,p.y] for p in shape.parts()])6、绘制面部特征drawConvexHull(36, 41) # 右眼 drawConvexHull(42, 47) # 左眼 drawConvexHull(48, 59) # 外嘴唇 drawConvexHull(60, 67) # 内嘴唇 drawLine(0, 17) # 下巴左侧到右眉起始 drawLine(17, 22) # 连接左右眉毛 drawLine(22, 27) # 左眉到鼻子 drawLine(27, 36) # 鼻子到右眼7、结果显示与资源释放最后显示结果cv2.imshow(Frame, image) cv2.waitKey(0) cv2.destroyAllWindows()