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

news/2024/4/25 12:21:35/文章来源:https://blog.csdn.net/q664243624/article/details/129145094

想要使用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.luyixian.cn/news_show_72233.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 四大主流 Web 编程框架

目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实。但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Python网络框架:Django、Tornado、Flask、Twisted。 …

Python os和sys模块

一、os模块 os 模块是 Python中的一个内置模块,也是 Python中整理文件和目录最为常用的模块。 该模块提供了非常丰富的方法用来处理文件和目录。比如:显示当前目录下所有文件/删除某个文件/获取文件大小 1、获取当前的工作路径 在 Python 中&#xff0…

linux查看WWN号及常见问题解决

linux查看WWN号及常见问题解决查看WWN号查看WWID号查询常见问题查看WWN号 要查看CentOS 6.7版本的WWN号,可以执行以下步骤: 1.确保已经连接了存储设备。 lspci | grep -i fibre2.在终端中输入命令:lsscsi,然后按 Enter 键。该命令…

redhawk:GSC file与STA file

1.GSC file redhawk做lowpower分析时需要GSC&#xff08;Global Switching Configuration&#xff09;file指导block/instance/power domain的开关状态。 Syntax&#xff08;in GSR file&#xff09;: GSC_FILES <gsc_FilePathName> Syntax&#xff08;in GSC file&a…

易基因|RRBS单碱基绘制580种动物的基因组规模DNA甲基化谱:Nature子刊

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2023年01月16日&#xff0c;奥地利科学院分子医学研究中心(CeMM)研究团队在《Nat Commun》杂志发表了题为“Comparative analysis of genome-scale, base-resolution DNA methylation prof…

【Git】Git是什么?简单说说Git的工作机制?Git的常用命令有那些?

目录 一、Git是什么? 二、简单说说Git的工作机制&#xff1f; 三、Git的常用命令有那些&#xff1f; &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、Git是什么? Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可…

Git push报错DeployKey does not support push code

错误描述用Git从本地仓库上传服务器仓库报错&#xff1a;DeployKey does not support push code错误代码&#xff1a;(通过$ git push origin master命令从本地仓库上传到服务器仓库)错误原因&#xff1a;没有注册ssh公钥解决办法&#xff1a;添加ssh公钥&#xff1a;先生成对应…

C++项目——高并发内存池(3)--central cache整体设计

1.central cache的介绍 1.1框架思想 1.1.1哈希映射 centralcache其实也是哈希桶结构的&#xff0c;并且central cache和thread cacha的哈希映射关系是一致的。目的为了&#xff0c;当thread cache某一个哈希桶下没有内存块时&#xff0c;可以利用之前编写的SizeClass::Index…

RPC编程:RPC概述和架构演变

RPC编程系列文章第一篇一&#xff1a;引言1&#xff1a;本系列文章的目标2&#xff1a;RPC的概念二&#xff1a;架构的演变过程1&#xff1a;单体架构1)&#xff1a;概念2)&#xff1a;特点3)&#xff1a;优缺点2&#xff1a;单体架构水平扩展1)&#xff1a;水平拓展的含义2)&a…

整车电源的几种模式:OFF/ACC/RUN/CRANK

本文框架1.前言2. 四种电源模式2.1 OFF模式2.2 ACC模式2.3 ON模式2.4 CRANK模式3. KL15/KL301.前言 在诊断或者网络管理相关模块开发对客户的需求进行梳理时&#xff0c;经常会看到客户对不同车辆模式下处理策略的需求&#xff0c;如果前期没接触过这几种模式&#xff0c;可能…

【C++】初识CC++内存管理

前言 我们都知道C&C是非常注重性能的语言&#xff0c;因此对于C&C的内存管理是每一个C/C学习者必须重点掌握的内容&#xff0c;本章我们并不是深入讲解C&C内存管理&#xff0c;而是介绍C&C内存管理的基础知识&#xff0c;为我们以后深入理解C&C内存管理做铺…

【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析

如果觉得我的分享有一定帮助&#xff0c;欢迎关注我的微信公众号 “码农的科研笔记”&#xff0c;了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 原文&…

Ardiuno-交通灯

LED交通灯实验实验器件&#xff1a;■ 红色LED灯&#xff1a;1 个■ 黄色LED灯&#xff1a;1 个■ 绿色LED灯&#xff1a;1 个■ 220欧电阻&#xff1a;3 个■ 面包板&#xff1a;1 个■ 多彩杜邦线&#xff1a;若干实验连线1.将3个发光二极管插入面包板&#xff0c;2.用杜邦线…

【JUC2022】第二章 多线程锁

【JUC2022】第二章 多线程锁 文章目录【JUC2022】第二章 多线程锁一、乐观锁与悲观锁1.悲观锁2.乐观锁二、八锁案例1.标准情况&#xff0c;有a、b两个线程&#xff0c;请问先打印邮件还是短信【结果&#xff1a;邮件】2.sendEmail方法中加入暂停3秒钟&#xff0c;请问先打印邮件…

华为OD机试 - 最小传递延迟(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

随机数与蒙特卡洛方法及Python实现

0 建议学时 4学时 1 引入 1.1 随机数与采样 客观世界的某些行为&#xff0c;结果具有随机性&#xff1a; 掷骰子、投硬币&#xff1b; 等待公交车的时间&#xff1b; 种子发芽的比例&#xff1b; … 1.2 随机数函数 1.2.1 random模块 Python的random模块中提供了若干生成…

RFID盘点软件为企业提供RFID固定资产管理方案

随着科技的发展&#xff0c;固定资产管理系统也经过了一些变革&#xff0c;从刚开始的单机版逐渐发展成SaaS版本&#xff0c;物联网版本等。从刚开始只支持条形码到支持二维码、RFID码。RFID固定资产管理系统上线后&#xff0c;通过给每个实物资产绑定一个RFID码标签后&#xf…

接口测试流程是怎样的?

接口测试流程是怎样的&#xff1f;总所周知&#xff0c;接口测试流程是怎样的&#xff1f;总所周知接口测试在软件测试中是一个非常重要的一部分&#xff0c;其主要目的是测试应用程序的接口是否能够按照规范要求与其他系统或组件进行交互&#xff0c;以及在不同负载条件下接口…

推荐一款新的自动化测试框架:DrissionPage

今天给大家推荐一款基于Python的网页自动化工具&#xff1a;DrissionPage。这款工具既能控制浏览器&#xff0c;也能收发数据包&#xff0c;甚至能把两者合而为一&#xff0c;简单来说&#xff1a;集合了WEB浏览器自动化的便利性和 requests 的高效率。 一、DrissionPage产生背…

vue3-element-admin搭建

vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 Element Plus 版本的后台管理前端解决方案&#xff0c;是 有来技术团队 继 youlai-mall 全栈开源商城项目的又一开源力作功能清单技术栈清单技术栈 描述官网Vue3 渐进式 JavaScript 框架 https://v3.cn.vuejs.org/Ty…