python+opencv最简单的人脸识别入门

2023-11-12

0前置操作

  1. 安装python(最新3.10即可)
  2. 安装pycharm(社区版即可)
  3. 安装opencv-python(cmd输入pip install opencv-python即可,嫌慢用国内镜像也可以)
  4. 后续也需要安装opencv-contrib-python

1读取图片

# 导入cv2模块,别名为cv
import cv2 as cv

# 读取图片
img = cv.imread("face1.jpg")

# 显示窗口到窗口上,窗口名就是read_img
cv.imshow("read_img", img)

# 窗口等待 0为不自动关闭 其他数值为等待时间,单位为毫秒,返回为按键的ASCII
key = cv.waitKey(0)  # 此代码不写会闪现窗口

# 释放内存,销毁窗口
cv.destroyAllWindows()

结果是直接在窗口直接显示图片

2灰度转换

# 导入cv模块
import cv2 as cv

# 读取图片
img = cv.imread("face1.jpg")
# 灰度转换
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 窗口显示灰度图
cv.imshow("gray", gray_img)
# 保存灰度图
cv.imwrite("face1_gray.jpg", gray_img)
# 显示原图
cv.imshow("img", img)
# 等待
cv.waitKey(0)
# 销毁
cv.destroyAllWindows()

灰度图与原始图比较

3修改尺寸

import cv2 as cv

# 读取原图
img = cv.imread("face1.jpg")

# 修改尺寸
resize_img = cv.resize(img, dsize=(200, 200))
# 显示原图
cv.imshow("img", img)
# 显示修改图,最大化也是修改后的图
cv.imshow("resize_img", resize_img)

# 打印修改前后的图片尺寸信息
print("未修改", img.shape)
print("修改后", resize_img.shape)

# 按键为q时退出窗口等待
while True:
    if ord('q') == cv.waitKey(0):
        break

# 释放内存,销毁窗口
cv.destroyAllWindows()

4绘制矩形或圆形(涉及人脸框使用)

import cv2 as cv

img = cv.imread("face1.jpg")

x, y, w, h = 100, 100, 100, 100
# 坐标轴以横向右为x轴正方向,以纵向下为y轴正方向
# 画矩形框(2个点可以确定一个边与x轴y轴垂直或平行的矩形) color(b,g,r)  thickness厚度
cv.rectangle(img, (x, y, x + w, y + h), color=(0, 0, 255), thickness=1)

# 画圆形(圆点+半径即可画一个圆)
cv.circle(img, center=(x + w, y + h), radius=100, color=(0, 255, 0), thickness=1)

# 显示
cv.imshow("img", img)

while True:
    if ord('q') == cv.waitKey(0):
        break

cv.destroyAllWindows()

5人脸识别

import cv2 as cv


# 检测函数 检索
def face_detect_demo():
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 转为灰度图片
    #电脑本地路径为E:/2022soft/py310/Lib/site-packages/cv2/data
    face_detect = cv.CascadeClassifier("haarcascade/haarcascade_frontalface_alt2.xml")  # 级联分类器
    # gray表示传入的灰度图(快速查询) 1.1表示每次搜索窗口依次扩大10% 5表示构成检测目标的相邻矩形的最小个数(默认为3个) (100,100)表示最小人脸大小 (300,300)表示最大人脸大小
    face = face_detect.detectMultiScale(gray, 1.1, 5, cv.CASCADE_SCALE_IMAGE, (30, 30), (200, 200))
    # 遍历所有人脸的位置信息,包括人脸位置及大小
    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=1)  # 画出识别出来的人脸框
    cv.imshow("result", img)


# 读取图片
img = cv.imread("p4.jpg")
# 检测图片
face_detect_demo()

while True:
    if ord('q') == cv.waitKey(0):
        break

cv.destroyAllWindows()

运行如下(疑似歪头马斯克没被识别出来)

6多人脸检测

import cv2 as cv


# 检测函数 检索
def face_detect_demo():
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 转为灰度图片
    face_detect = cv.CascadeClassifier("haarcascade/haarcascade_frontalface_default.xml")  # 级联分类器
    face = face_detect.detectMultiScale(gray, minSize=(30, 30))  # 检索人脸
    # 遍历所有人脸的位置信息,包括人脸位置及大小
    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=1)  # 画出识别出来的人脸框
    cv.imshow("result", img)


# 读取图片
img = cv.imread("p3.jpg")
# 检测图片
face_detect_demo()

while True:
    if ord('q') == cv.waitKey(0):
        break

cv.destroyAllWindows()

7视频检测

import cv2 as cv


# 检测函数 检索 画框
def face_detect_demo(img):
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 转为灰度图片
    face_detect = cv.CascadeClassifier("haarcascade/haarcascade_frontalface_default.xml")  # 级联分类器
    face = face_detect.detectMultiScale(gray, minSize=(30, 30))  # 检索人脸
    # 遍历所有人脸的位置信息,包括人脸位置及大小
    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=1)  # 画出识别出来的人脸框
    cv.imshow("result", img)


# cap =cv.VideoCapture(0)#摄像头取数据
cap = cv.VideoCapture("2.mp4")

while True:
    flag, frame = cap.read()  # 得到状态和帧数据
    if not flag:
        break
    face_detect_demo(frame)  # 帧数据检索人数并画框
    cv.waitKey(1)

cv.destroyAllWindows()
cap.release()

更换了检测数据源,从单张图片导摄像头 或视频文件,本质不变,依旧是检测每一帧的人脸,受限于初始模型的能力,误识率还是比较高的。

8拍照保存

import cv2 as cv

# 打开摄像头
cap = cv.VideoCapture(0)

count = 1

while (cap.isOpened()):  # 检测摄像头是否开启
    ret_flag, Vshow = cap.read()  # 得到每帧数据
    cv.imshow("Capture", Vshow)  # 显示预览

    k = cv.waitKey(1) & 0xFF  # 按键判断
    if (k == ord('s')):
        cv.imwrite(str(count) + "_camera.jpg", Vshow)  # 保存
        print("Success to save " + str(count) + "_camera.jpg\n")
        count += 1
    elif k == ord(" "):  # 退出
        break
# 释放摄像头
cap.release()
# 释放窗口内存
cv.destroyAllWindows()

9训练人脸(提取人脸特征)

import os
import cv2 as cv
from PIL import Image

import numpy as np


def getImageAndLabels(path):
    # 储存人脸数据
    facesSamples = []
    # 储存姓名数据
    ids = []
    # 储存图片信息
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
    # 加载分类器
    face_detector = cv.CascadeClassifier("haarcascade/haarcascade_frontalface_alt2.xml");
    # 遍历列表中的图片
    for imagePath in imagePaths:
        # 打开图片,灰度化,PIL有9种模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F
        PIL_img = Image.open(imagePath).convert('L')
        # 将图像转为数组,以黑白深浅
        img_numpy = np.array(PIL_img, 'uint8')
        # 获取图片人脸特征
        faces = face_detector.detectMultiScale(img_numpy)
        # 获取每张图片的id和姓名
        id = int(os.path.split(imagePath)[1].split('-')[0])
        # 预防无面容照片
        for x, y, w, h in faces:
            ids.append(id)
            facesSamples.append(img_numpy[y:y + h, x: x + w])

        print('id=', id)
    # 打印面部特征和id
    print('fs=', facesSamples)

    return facesSamples, ids


if __name__ == '__main__':
    # 图片路径
    path = "data/face/"
    # 获取图像数组和id标签数组和姓名
    faces, ids = getImageAndLabels(path)
    # 加载识别器 这里的face在opencv-contrib-python上,所以,你懂的
    recognizer = cv.face.LBPHFaceRecognizer_create()
    # 训练
    recognizer.train(faces, np.array(ids))
    # 保存文件
    recognizer.write("trainer/trainer.yml")

10人脸识别

import cv2 as cv
import os


def face_detect_demo(img):
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    face_detector = cv.CascadeClassifier(
        "haarcascade/haarcascade_frontalface_default.xml")  # 级联分类器
    # gray表示传入的灰度图(快速查询) 1.1表示每次搜索窗口依次扩大10% 5表示构成检测目标的相邻矩形的最小个数(默认为3个) (100,100)表示最小人脸大小 (300,300)表示最大人脸大小
    face = face_detector.detectMultiScale(gray, 1.1, 5, cv.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))
    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=1)
        ids, confidence = recognizer.predict(gray[y:y + h, x:x + w])
        if confidence > 80:#差别较大,当做不认识
            cv.putText(img, "unknow" + str(confidence), (x + 10, y - 10), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
            cv.putText(img, str(names[ids - 1]) + str(confidence), (x + 10, y - 10), cv.FONT_HERSHEY_SIMPLEX, 0.75,
                       (0, 255, 0), 1)
    cv.imshow("result", img)


def getName():
    path = 'data/face/'
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
    for imagePath in imagePaths:
        name = str(os.path.split(imagePath)[1].split('-', 2)[1])
        names.append(name)


names = []

getName()
recognizer = cv.face.LBPHFaceRecognizer_create()

recognizer.read('trainer/trainer.yml')#加载人脸特征值,之前训练出来的

warningtime = 0

img = cv.imread("p6.jpg")#识别图片
face_detect_demo(img)
cv.waitKey(0)

cap = cv.VideoCapture("2.mp4")
while True:
    flag, frame = cap.read()
    if not flag:
        break
    face_detect_demo(frame)#视频每一帧识别

    cv.waitKey(1)

11网络视频播放

import cv2


class CaptureVideo(object):
    def net_video(self):
        # 获取网络视频流
        cam = cv2.VideoCapture("rtmp://media3.scctv.net/live/scctv_800")#好不容易找到一个可以播放的视频源
        while cam.isOpened():
            sucess, frame = cam.read()
            cv2.imshow("Network", frame)
            cv2.waitKey(1)


if __name__ == "__main__":
    capture_video = CaptureVideo()
    capture_video.net_video()

整个流程就over了。
感谢哔哩哔哩UP主-会AI的哈利波特的视频分享-https://www.bilibili.com/video/BV1dT4y1z7it,烦请多多三连。
UP主已贴了代码,但我自己全手动敲了一遍,对小白来说,收益匪浅。
虽然识别的时候有一定(很大)的误识率,甚至出现一些好笑(智障)的效果,但是,真的超级简单,十分适合opencv+python的入门。
仅以此文开启opencv的整体学习。
针对pycharm引入opencv-python后无法跳转/自动提示等问题,问题在于高版本opencv-python与pycharm适配问题,使用低版本即可,如版本=4.5.5.64

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python+opencv最简单的人脸识别入门 的相关文章

  • 使用 python 进行串行数据记录

    Intro 我需要编写一个小程序来实时读取串行数据并将其写入文本文件 我在读取数据方面取得了一些进展 但尚未成功地将这些信息存储在新文件中 这是我的代码 from future import print function import se
  • python future 和元组解包

    实现像使用 future 进行元组解包这样的事情的优雅 惯用的方法是什么 我有这样的代码 a b c f x y g a b z h y c 我想将其转换为使用期货 理想情况下我想写一些类似的东西 a b c ex submit f x y
  • 我怎样才能更多地了解Python的内部原理? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我使用Python编程已经有半年多了 我对Python内部更感兴趣 而不是使用Python开发应用程序
  • 如何在序列化器创建方法中获取 URL Id?

    我有以下网址 url r member P
  • pydev 调试器:严重警告:此版本的 python 似乎编译不正确(内部生成的文件名不是绝对的)[重复]

    这个问题在这里已经有答案了 通过运行 from sklearn datasets import fetch california housing import pandas as pd pd set option precision 4 m
  • Python逻辑运算符优先级[重复]

    这个问题在这里已经有答案了 哪个运算符优先4 gt 5 or 3 lt 4 and 9 gt 8 这会被评估为真还是假 我知道该声明3 gt 4 or 2 lt 3 and 9 gt 10 显然应该评估为 false 但我不太确定 pyth
  • 如何使用 Plotly 中的直方图将所有离群值分入一个分箱?

    所以问题是 我可以在 Plotly 中绘制直方图 其中所有大于某个阈值的值都将被分组到一个箱中吗 所需的输出 但使用标准情节Histogram类我只能得到这个输出 import pandas as pd from plotly import
  • 从 ffmpeg 获取实时输出以在进度条中使用(PyQt4,stdout)

    我已经查看了很多问题 但仍然无法完全弄清楚 我正在使用 PyQt 并且希望能够运行ffmpeg i file mp4 file avi并获取流式输出 以便我可以创建进度条 我看过这些问题 ffmpeg可以显示进度条吗 https stack
  • 将数据帧行转换为字典

    我有像下面的示例数据这样的数据帧 我正在尝试将数据帧中的一行转换为类似于下面所需输出的字典 但是当我使用 to dict 时 我得到了索引和列值 有谁知道如何将行转换为像所需输出那样的字典 任何提示都非常感激 Sample data pri
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • Seaborn Pairplot 图例不显示颜色

    我一直在学习如何在Python中使用seaborn和pairplot 这里的一切似乎都工作正常 但由于某种原因 图例不会显示相关的颜色 我无法找到解决方案 因此如果有人有任何建议 请告诉我 x sns pairplot stats2 hue
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • 无法在 osx-arm64 上安装 Python 3.7

    我正在尝试使用 Conda 创建一个带有 Python 3 7 的新环境 例如 conda create n qnn python 3 7 我收到以下错误 Collecting package metadata current repoda
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • 使用 Firefox 绕过弹出窗口下载文件:Selenium Python

    我正在使用 selenium 和 python 来从中下载某些文件web page http www oceanenergyireland com testfacility corkharbour observations 我之前一直使用设
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 如何读取Python字节码?

    我很难理解 Python 的字节码及其dis module import dis def func x 1 dis dis func 上述代码在解释器中输入时会产生以下输出 0 LOAD CONST 1 1 3 STORE FAST 0 x
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d

随机推荐

  • 【转】Robust regression(稳健回归)

    Robust regression 稳健回归 语法 b robustfit X y b robustfit X y wfun tune b robustfit X y wfun tune const b stats robustfit 描述
  • 在服务器上用conda创建新的python环境报错(PackagesNotFoundError)

    主要参考这篇博客 https blog csdn net weixin 43815222 article details 108549497 报错截图 prefix 后跟的是我的虚拟环境路径 home envs assignmaterial
  • 汉诺塔——递归的应用

    关于汉诺塔的原理 可看这里 点击打开链接 下面是源代码 include
  • SpringBoot参数校验--List类型

    我们在写后台接口的时候 通常会定义DTO来接收参数 在DTO中使用注解书写验证的规则 然后在Controller层使用 validated注解来验证自己制定的校验规则 但当我们的接口接收的参数为List
  • 面试题,说说你对spring IOC和AOP的理解

    在面试中 经常会问 说说你对spring IOC和AOP的理解 问题很宽泛 似乎不知道从何说起 回答思路 1 先用通俗易懂的话解释下何为IOC和AOP 2 各自的实现原理 3 自己的项目中如何使用 以下是个人的一些总结 仅供参考 1 IOC
  • java异常处理

    目录 异常概述与异常体系结构 常见异常2 数组下标越界异常 空指针异常 异常的运算 转换不兼容 异常处理机制一 异常处理机制二 手动抛出异常 用户自定义异常类 总结 异常概述与异常体系结构 在使用计算机语言进行项目开发的过程中 即使程序员把
  • 在winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序

    在需要屏蔽双击窗体最大化 最小化 关闭 拖拽窗体中写入以下代码 可以根据需要取舍代码 protected override void WndProc ref Message m if m Msg 0x112 switch int m WPa
  • 数组方法对字符串使用时,需要注意的地方

    在平时工作或者练习的时候 我们有时会使用数组的方法去处理字符串 在使用时 我们可以发现有些方法可以对字符串使用 但是有一些不能 那么 这个规律究竟是什么 为什么有的可以使用 而有的不能使用 那些不能使用的原因是什么 分析思路 我们可以看到
  • 程序员到底要怎么找女朋友?

    漫小话碎碎念 新弄了个小专栏 以两三格漫画的形式给大家呈现一些只有程序猿才能看懂的梗 刚开始着手弄这个part 一切都还不太成熟 也欢迎大家在留言区提出一些建议 可以是一些梗 可以是形象整改 表达形式 都好 目前定在每周五发 毕竟工作了一周
  • windows驱动程序开发初探

    最近 由于需求推动 自己得开始学一下在windows下如何开发驱动程序 虽然 后来由于其他的原因使得学习没继续下去 但是我还是把一些粗略的学习经历与体会写在这里 方便自己日后卷土重来 也方便其他的对windows开发一窍不通的有志之士参考一
  • IP地址判断有效性

    IP地址判断有效性 标签 空格分隔 OJ 算法 1 题目 判断输入的字符串是不是一个有效的IP地址 详细描述 请实现如下接口 boolisIPAddressValid constchar pszIPAddr 输入 pszIPAddr 字符串
  • 基于选择排序的一些想法

    选择排序的工作原理是 每一次从待排序的数据中选出最小 或最大 的一个元素 存放在序列的起始位置 然后 再从剩余未排序元素中继续寻找最小 大 元素 放到已排序序列的末尾 以此类推 直到全部待排序的数据元素排完 优化思路是 每次循环都同时找出最
  • Elasticsearch之聚合aggregations

    聚合可以让我们极其方便的实现对数据的统计 分析 例如 什么品牌的手机最受欢迎 这些手机的平均价格 最高价格 最低价格 这些手机每月的销售情况如何 实现这些统计功能的比数据库的sql要方便的多 而且查询速度非常快 可以实现实时搜索效果 1 基
  • Paimon 学习笔记

    本博客对应于 B 站尚硅谷教学视频 尚硅谷大数据Apache Paimon教程 流式数据湖平台 为视频对应笔记的相关整理 1 概述 1 1 简介 Flink 社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehou
  • Docker boot2docker镜像默认用户和密码

    用户 密码 进入方式 docker tcuser ssh root command sudo i docker用户下执行
  • 记录一个iOS实现视频分片缓存拖拽快进不能播放的问题

    代码现状 首先来看一下我们将视频数据塞给请求的代码 void finishLoadingWithLoadingRequest IdiotResourceTask task printf 哈哈执行到这里执行到到这里 n printf 哈哈哈数
  • 【目标检测-YOLO】YOLOv5-5.0v-损失函数(第四篇)

    YOLO Input Backbone Neck Head 置信度Loss 坐标回归Loss 分类Loss v1 448 448 GoogleNet FC 2 MSE v2 32x D
  • mod_jk 分析

    mod jk 分析 1 mod jk 模块的总体功能 由于 tomcat 的 HTTP 处理部分都由 Java 所写 5 5 12 版本以后出现了 native 库 用以 提高其 I O 和 SSL 的性能 1 在高并发的情况下负载较高 而
  • 误解#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

    define GPIOA BASE AHB1PERIPH BASE 0x0000 typedef struct IO uint32 t MODER lt GPIO port mode register Address offset 0x00
  • python+opencv最简单的人脸识别入门

    0前置操作 安装python 最新3 10即可 安装pycharm 社区版即可 安装opencv python cmd输入pip install opencv python即可 嫌慢用国内镜像也可以 后续也需要安装opencv contri