【OpenCV学习笔记01】- 初步使用OpenCV实现人脸识别

news2025/2/27 7:10:00

想要使用opencv实现人脸识别,我们需要做这样几步:

1.opencv-python的安装

这里我们使用的python的opencv-python库,在安装opencv-python库之前,我们需要安装numpy, matplotlib。

# 安装指令
# 安装 numpy
pip install numpy
# 安装 matplotlib
pip install matplotlib
# 安装 opencv
pip install opencv

2.opencv的简单使用

Opencv能完成以下从加载图像到调整大小等基本操作:

  • 使用OpenCV加载图片
  • 查看图片形状/分辨率
  • 显示图片
  • 调整图像大小

2.1 使用OpenCV加载图片

# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片,这里注意了图片路径必须为英文
img = cv2.imread("图片路径")

加载图片还有第二个参数

# 引用 opencv
import cv2 
# 加载彩色图片
img = cv2.imread("图片路径", 1)
# 引用 opencv
import cv2 
# 加载黑白图片
img = cv2.imread("图片路径", 0)

2.2 查看图片形状/分辨率

# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("图片路径")
print(img.shape)

2.3 显示图片

# 引用 opencv
import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("图片路径")
# imshow的第一个参数是展示出来图片的标题,第二个参数就是我们加载的图片
cv2.imshow("image", img)
# waitKey使窗口保持静态直到用户按下一个键,传入的参数单位是毫秒
# 当设置的值为0的时候,则代表一直等待
cv2.waitKey(0)
# destroyAllWindows 函数:销毁所有展示的窗口
cv2.destroyAllWindows()

2.4 调整图像大小

import cv2
# 加载图片,使用一个参数加载图片
img = cv2.imread("图片路径")
# 只调整图片尺寸,图片会压缩
resized_image = cv2.resize(img, (650, 500))
cv2.imshow("resized_image: ", resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.人脸识别特征文件准备

github网站下载开源人脸特征数据 opencv-github地址
我们使用的是基于 Haar 特征的 cascade 分类器做人脸识别;

3.1 找到图片中的人脸数据

我们先通过人脸特征数据检测出图片中的人脸数据
我使用的图片是:
在这里插入图片描述
网上找到

# 引用 opencv
import cv2

# 加载图片,使用一个参数加载图片
img = cv2.imread("./img_3.png")
# 加载人脸特征数据文件
# CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类。传入人脸特征数据,返回识别出的人脸对象。
face_cascade = cv2.CascadeClassifier("./haarcascade_frontalface_default.xml")
# 使用detectMultiScale()接收返回检测出的人脸对象
faces = face_cascade.detectMultiScale(img)
# 打印检测出的人脸数据
print(faces)

cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印出的数据

[[292  79  41  41]
 [438  81  41  41]
 [609 103  36  36]
 [749  96  38  38]
 [232 204  42  42]
 [392  72  58  58]
 [465 190  50  50]
 [404 298  49  49]
 [ 84 291  41  41]
 [757 308  41  41]
 [315 168  39  39]
 [568 302  41  41]
 [103 176  43  43]
 [370 377  53  53]
 [684 395  50  50]
 [234 373  49  49]
 [105 425  54  54]
 [537 383  51  51]
 [537 412  57  57]
 [264 474  49  49]
 [464 449  51  51]
 [662 468  46  46]
 [ 13 442  60  60]
 [603 585  36  36]
 [356 762  50  50]]

3.2 在原图画出检测出的人脸

在图片中把检测出来的人脸画出来

# 引用 opencv
import cv2

# 加载图片,使用一个参数加载图片
img = cv2.imread("./img_3.png")
# 加载人脸特征数据文件
# CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类。传入人脸特征数据,返回识别出的人脸对象。
face_cascade = cv2.CascadeClassifier("./haarcascade_frontalface_default.xml")
# 使用detectMultiScale()接收返回检测出的人脸对象
faces = face_cascade.detectMultiScale(img)
# print(faces)
# 通过 rectangle 画出检测出的人脸
for x, y, w, h in faces:
    cv2.rectangle(img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0))

cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出的结果如下:
在这里插入图片描述

3.3 在原图画出检测出的人脸,精度识别

这里我们会发现上面输出的结果有很多干扰项,我们可以通过设置精度进行调优,不过这中间没办法100%的命中每个人脸。

# 引用 opencv
import cv2

# 加载图片,使用一个参数加载图片
img = cv2.imread("./images/learn1/data/img_3.png")
# 加载人脸特征数据文件
# CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类。传入人脸特征数据,返回识别出的人脸对象。
face_cascade = cv2.CascadeClassifier("./haarcascades/haarcascade_frontalface_default.xml")
# 使用detectMultiScale()接收返回检测出的人脸对象
# 简单识别人脸
# faces = face_cascade.detectMultiScale(img)
# 提升精度识别人脸
# scaleFactor表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%,此处调整为1.3。
# minNeighbors表示构成检测目标的相邻矩形的最小个数(默认为3个)。该参数指定每一个候选矩形边界框需要有多少相邻的检测点,此处调整为5。
faces = face_cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=5)
# print(faces)
# 通过 rectangle 画出检测出的人脸
for x, y, w, h in faces:
    cv2.rectangle(img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 0))

cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过调整精度之后,虽然命中的都是人脸,但是有部分人脸没有识别到。
在这里插入图片描述
好吧,我暂时能做到的只有这种程度,如果再精确的命中人脸,我还需要努力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chirp-Z变换(线性调频Z变换)原理

Chirp-Z变换(Chirp-Z Transform,CZT) 采用FFT算法可以很快地计算出全部DFT值,即Z变换在单位圆上的全部等间隔采样值。 在实际情况中,并不需要对整个单位圆的频谱进行分析,例如,对于窄带信号&am…

运动型蓝牙耳机推荐哪款、最新运动蓝牙耳机推荐

提起运动耳机,如今很多运动爱好者和职业教练员们,都会向萌新推荐骨传导运动耳机。骨传导耳机解决了入耳式蓝牙耳机掉落的问题,佩戴相当舒服。骨传导耳机在佩戴过程中解放了双耳,不会因为耳机堵住耳朵,听不到环境音&…

【Spring6】| Spring启示录、Spring概述

目录 一:Spring启示录 1. OCP开闭原则 2. 依赖倒置原则DIP 3. 控制反转IoC 二:Spring概述 1. Spring简介 2. Spring8大模块 3. Spring特点 一:Spring启示录 引言:前面我们已经学习了三层架构:表示层、业务层、…

【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题

任务描述 错误出现出现过四五次,应该是诊断单元tf卡读写出问题导致下面这条告警一直高频写入到/var/log/下的syslog、kern.log、messages中 Nov 23 06:25:12 embest kernel: omap_hsmmc 48060000.mmc: [omap_hsmmc_pre_dma_transfer] invalid cookie: data->hos…

将maven项目打包成可执行的jar(加入外部依赖)

在有些场景下我们需要将编写的Java工程编译打包成为一个完整的jar包,如果你的项目是使用maven构建的话可以通过以下方法来完成这个打包的过程。添加maven打包插件。在项目的pom.xml配置文件的build标签中添加以下代码,其中 mainClass 属性需要替换成你项…

多种调度模式下的光储电站经济性最优储能容量配置分析(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

安装MQTT Server遇到报错“cannot verify mosquitto.org‘s certificate”,该如何解决?

MQTT是基于发布/订阅的轻量级即时通讯协议,很适合用于低带宽、不稳定的网络中进行远程传感器和控制设备通讯等操作中。在我们的软件研发中,也经常使用MQTT协议进行消息通信等。今天来和大家分享一些关于在安装MQTT Server中遇到的疑难问题及解决思路。当…

为什么阳康后,感觉自己变傻了?

不少人在阳康后出现脑力下降的情况,好像脑子里被雾笼罩。脑雾并不是新名词,已经存在了十几年。以前慢性疲劳综合征患者和脑震荡患者会用它来形容自己的症状。脑雾其实是认知障碍,它可由多种原因引起。比如过度劳累、长期酗酒、缺乏睡眠、久坐…

Semi-supervised(半监督)布料缺陷检测实战

数据及源码链接见文末 1.任务目标和流程概述 对于常规的缺陷检测,常常需要我们准备好数据,使用分割或者检测的方法选择模型,进行训练。但是有一个问题。在日常生产中,我们接触到的往往都是正常的,缺陷数据往往很难收集,更何况我们还要打标签。我们能不能通过训练正常数据…

独立搭建 handle server

本节主要介绍,如何搭建一个与 GHR隔离的 handle sever,不与外界有任何连通。 下载文件 访问地址下载最新版:http://www.handle.net/download_hnr.html 这里以 9.3.0 版本作为讲解 解压服务端,解压客户端 # 解压 tar -xzvf handle-9.3.0-distribution.tar.gz# 到目录下 …

NestJS学习:图片上传、下载

参考 大神的这两篇文章讲的很详细,这里自己也来试一下 小满nestjs(第十三章 nestjs 上传图片-静态目录) 小满nestjs(第十四章 nestjs 下载图片) 上传图片 安装包 需要:multer 和 nestjs/platform-expre…

深入理解Java的Lambda原理

1、前言 Lambda函数的概念其实有很久远的历史了,在Lisa,C#中早有实现。且近年来,开发者对语言的表现力有了更高的要求,Java也在JDK 1.8 中引入了Lambda函数这一概念。虽然截止到写下这段文字的一刻已经过去七年之久,但…

Mybatis框架详解(全)

目录 MyBatis简介 MyBatis整体架构及运行流程 1.数据源配置文件 2.Sql映射文件 3.会话工厂与会话 4.运行流程 mybatis实现增删改查 Mybatis的获取参数的方式 mapper中自定义映射 mybatis注解开发 mybatis缓存 mybatis分页插件 MyBatis简介 MyBatis 是一款优秀的持久…

程序员如何向架构师转型?看完就明白该怎么做了

软件行业技术开发从业人员众多,但具备若干年开发经验的普通的开发人员往往面临个人发展的瓶颈,即如何从普通开发人员转型成高层次的系统架构师和技术管理人员。想成为一名架构师,应当具备全面的知识体系,需要进行系统的学习和实践…

数组(一)-- LeetCode[26][80] 删除有序数组中的重复元素

1 删除有序数组中的重复项 1.1 题目描述 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度&#xff0c…

FreeRTOS与UCOSIII任务状态对比

FreeRTOS任务状态 1、运行态 正在运行的任务,正在使用处理器的任务。 单核处理器中任何时候都有且只有一个任务处于运行态。 2、就绪态 已经准备就绪(非阻塞或挂起),可以立即运行但还没有运行的任务。 正在等待比自己高优先级…

Kafka——消息队列学习总结

定义 Kafka是一个分布式的基于发布/订阅模式的消息队列(MQ),主要应用于大数据实时处理领域。 模式 点对点模式 一对一,消费者主动拉取数据,消费收到后消息清除。 发布/订阅模式 一对多,消费者消费数据后不会清除消息…

JavaScript:使用for in不是一个很好的抉择

for in 如果让你遍历对象中的key和value,你第一个想到的一定是使用for in const o{name:"chengqige",age:23 } for (let key in o){console.log(key,o[key]); }看起来是没有问题的,但是如果我在下面加一行代码,输出的结果就可能让…

JUC并发编程——进程与线程

目录一、进程和线程的概念1.1 进程1.2 线程1.3 进程与线程对比二、并行和并发的概念三、线程基本应用3.1 多线程应用——异步调用一、进程和线程的概念 1.1 进程 ● 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 …

内容生态与新业务双突破,汽车之家反转逻辑将延续

2022年,疫情对汽车市场的影响不容忽视。但从财报来看,汽车之家在宏观压力下仍实现了有力的V型反转。 北京时间2月16日美股盘前,汽车之家发布2022Q4及全年财报。财报显示,其四季度实现总营收18.93亿元,同比增长11.8%。…