小白从零开始勇闯人工智能:计算机视觉初级篇(OpenCV补充(1))

引言

前面我们已经基本掌握了OpenCV中的基础知识了,本经将继续补充基础人脸检测到复杂视觉分析的全过程,学习如何使用OpenCV和dlib等开源库,实现包括人脸检测、关键点定位等综合视觉系统。

一、人脸检测基础:从静态图像开始

1、代码结构与导入

导入两个核心库:cv2(OpenCV):开源的计算机视觉库,提供丰富的图像处理函数,dlib:一个现代化的C++工具包,包含机器学习算法,特别在人脸检测和关键点定位方面表现优异。

复制代码
import cv2
import dlib

2、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和dlib

复制代码
import cv2
import dlib

2、初始化人脸检测器和摄像头

通过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 dlib

2、初始化人脸检测器和导入图片

复制代码
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 cv2             

2、定义绘制直线函数

在图像上绘制连接一系列连续特征点的直线段。接收起始和结束两个索引值作为参数,从预定义的关键点集合(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()
相关推荐
困死,根本不会2 小时前
OpenCV摄像头实时处理:基于模板匹配的摄像头实时数字识别
python·opencv·计算机视觉
铁蛋AI编程实战2 小时前
Gemini in Chrome 全实战:解锁+API调用+自定义扩展+本地推理
前端·人工智能·chrome
OLOLOadsd1232 小时前
【深度学习】RetinaNet_RegNetX-800MF_FPN_1x_COCO_金属表面缺陷检测与分类模型解析
人工智能·深度学习·分类
juxieyiyi8782 小时前
PCDN自建平台,掌握全链路主动权
人工智能·边缘计算·cdn·pcdn·pcdn平台搭建双收益
光羽隹衡2 小时前
计算机视觉——Opencv(直方图均衡化)
人工智能·opencv·计算机视觉
Faker66363aaa2 小时前
YOLO11-SEG-SDI实战:笔记本LCD屏幕缺陷检测与分类的创新方案
人工智能·分类·数据挖掘
qwy7152292581632 小时前
12-图像的仿射(平移、旋转)
人工智能·opencv·计算机视觉
2501_941322032 小时前
航拍卷心菜农田目标检测与识别:YOLO11-C3k2多尺度边缘信息选择方案详解
人工智能·目标检测·目标跟踪
yuhulkjv3352 小时前
deepseek能导出图片
人工智能·chatgpt