人脸关键点识别

简介: 【6月更文挑战第21天】

只显示关键点,不显示摄像头画面

image.png

import numpy as np
from imutils import face_utils
import dlib
import cv2

p = "shape_predictor_68_face_landmarks.dat"
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(p)

cap = cv2.VideoCapture(0)

while True:

    _, image = cap.read()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    rects = detector(gray, 0)
    # 尺寸可以根据需要调整,绘制新图像,用于只显示关键点,不显示人脸
    image = np.zeros((500, 500, 3), dtype="uint8")

    for (i, rect) in enumerate(rects):

        shape = predictor(gray, rect)
        shape = face_utils.shape_to_np(shape)

        for j, (x, y) in enumerate(shape):
            cv2.circle(image, (x, y), 1, (0, 255, 0), -1)
            # cv2.putText(image, str(j + 1), (x + 5, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1)

    cv2.imshow("Output", image)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()
cap.release()

现有代码中,导致摄像头画面不显示的原因可能是在循环中创建了一个空白的图像数组,并且没有将检测到的人脸标记绘制到原始图像上,而是绘制到了这个空白图像上。具体来说,问题出在以下这段代码:

image = np.zeros((500, 500, 3), dtype="uint8")  # 尺寸可以根据需要调整

这行代码创建了一个500x500像素的空白图像,并且后续的操作都是在这个空白图像上进行的。因此,原始的摄像头画面并没有被显示出来。

为了让人脸正常显示,你需要将人脸标记绘制到原始图像上,而不是空白图像上。以下是修改后的代码段:

# ... 省略之前的代码 ...

while True:
    _, image = cap.read()  # 读取原始图像
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    rects = detector(gray, 0)

    for (i, rect) in enumerate(rects):
        shape = predictor(gray, rect)
        shape = face_utils.shape_to_np(shape)

        # 绘制人脸标记到原始图像上
        for j, (x, y) in enumerate(shape):
            cv2.circle(image, (x, y), 1, (0, 255, 0), -1)
            # cv2.putText(image, str(j + 1), (x + 5, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1)

    # 显示原始图像,上面有绘制的人脸标记
    cv2.imshow("Output", image)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

# ... 省略之后的代码 ...

注意,我已经将创建空白图像的代码行删除了,并且将绘制人脸标记的代码移动到了原始图像上。这样,摄像头的画面就会正常显示,并且上面会有人脸标记。

目录
相关文章
|
编解码 数据可视化 API
如果实现图像人脸融合?
本文介绍的API接口是阿里云视觉智能开放平台的图像人脸融合,用以演示。
1124 1
如果实现图像人脸融合?
|
安全 NoSQL Java
SpringSecurity原理简述(上)
SpringSecurity原理简述
287 2
|
NoSQL 网络协议 数据库
为什么 Lettuce 会带来更长的故障时间
本文详述了阿里云数据库 Tair/Redis 将使用长连接客户端在非预期故障宕机切换场景下的恢复时间从最初的 900s 降到 120s 再到 30s的优化过程,涉及产品优化,开源产品问题修复等诸多方面。
69295 11
为什么 Lettuce 会带来更长的故障时间
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
286 2
|
Go API 微服务
当 go-zero 邂逅 chatgpt...
当 go-zero 邂逅 chatgpt...
|
存储 缓存 监控
解锁Vuex性能优化的秘密:让大型Vue应用如丝般顺滑,紧跟技术热点,体验速度与效率的双重飞跃!
【8月更文挑战第27天】Vuex是Vue.js应用程序的状态管理解决方案,它允许开发者集中管理组件间共享的状态。然而,在大型应用中,庞大的状态树可能会影响性能。本文介绍几种优化策略:1)精简状态树,避免存储不必要的数据并通过模块化降低复杂度;2)利用getters缓存计算结果以提高效率;3)通过actions处理异步操作,确保状态更新的同步性和逻辑清晰;4)在组件级别上减少不必要的重渲染;5)使用工具如Vue Devtools进行监控和调试。这些方法有助于提升应用的整体性能和用户体验。
356 0
|
机器学习/深度学习 人工智能 编解码
【AI系统】轻量级CNN模型新进展
本文继续探讨CNN模型的小型化,涵盖ESPNet、FBNet、EfficientNet和GhostNet系列。ESPNet系列通过高效空间金字塔卷积减少运算量;FBNet系列采用基于NAS的轻量化网络设计;EfficientNet系列通过复合缩放方法平衡网络深度、宽度和分辨率;GhostNet系列则通过Ghost模块生成更多特征图,减少计算成本。各系列均旨在提升模型效率和性能,适用于移动和边缘设备。
938 6
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
304 4
|
机器学习/深度学习 算法 vr&ar
深度学习之人脸关键点检测
人脸关键点检测的主要任务是识别并定位人脸图像中的特定关键点,例如眼睛的角点、眉毛的顶点、鼻子的底端、嘴角等。这些关键点不仅能提供面部结构的几何信息,还可以用于分析表情、识别个体,甚至检测面部姿势。
397 2
|
数据处理 Python
Python数据转换:从Pandas到NumPy转换
Python数据转换:从Pandas到NumPy转换
386 0