当前位置:网站首页>基于opencv实现人脸检测
基于opencv实现人脸检测
2022-07-31 02:02:00 【程序小黑】
人脸检测是对人脸图片进行处理的前提条件,如果需要进行学习,那么数据集的采样可以配合人脸检测功能进行联动采集和过滤。此处,我们主要采用python程序设计语言来对图片中的人脸信息进行处理。
首先我们需要在我们的计算机中安装opencv,如果安装出现问题的,可以尝试通过anaconda进行一个新环境的安装。
首先我们导入模块
import cv2 #opencv2库
import matplotlib.pyplot as plt #plt绘图库
import numpy as np
import os
import scipy.io
在这里,我们不仅要对我们采集到的人脸进行检测,我们还需要将一个画面中出现的不同的人脸打上一个标签,如果出现两个人脸相同的情况,那么我们认定他们是同一个人,就将他们的信息存储在一起。(这部分代码暂不放出)
获得人脸信息
在人脸检测的代码中,我们首先需要载入我们的级联分类器,在opencv中,我们的级联分类器的函数为:CascadeClassifier
我们载入开源的haarcascade_frontalface_default.xml人脸分类器
下载链接:https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
我们通过级联分类器对我们级联分类器分类出的信息进行过滤,获得我们想要的人脸数据。我们可以使用 分类器的detectMultiScale方法。
该方法中的image参数需要是一个图片信息,scanleFactor参数则是指定在每个图像比例下图像尺寸减小多少的参数,minNeighbors参数指定每个候选矩形应保留多少个邻居的参数,我们在这里对scanleFactor设置为1.5,对minNeighbors设置为5。
那么我们的代码如下:
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(image = img, scaleFactor = 1.5, minNeighbors = 5)
我们得到的faces是一个向量数组(类似于pytorch中的张量,也就是tensor),但是其本质是数组,我们通过len方法获得faces数组中的个数,那么如果len(faces)<0,我们的图片中就没有检测到任何的人脸。
人脸裁剪
通过for循环遍历faces数组,获得我们的像tensor实际上是numpy.Array的数据类型,并通过start_pos和end_pos获得在二维坐标系的起始坐标和对角线上的结束坐标。得到了一个矩形。
for (x, y, w, h) in faces:
start_point = (x,y)
end_point = (x+w,y+h)
#图像绘图
cv2.rectangle(img, start_point, end_point, (255, 0, 0), 2) #color参数的顺序是BGR,因此(255,0,0)显示的是蓝色的线条,##最后一个参数表示矩形框的厚度。
#图像裁剪,并保存为temp.png
crop = img[y:(y + h), x:(x + w)]
人脸绘制
在裁剪后,我们对图像进行最后的处理,暂时我们的处理结果
finalimg = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
plt.figure(figsize=(5,5))
plt.imshow(finalimg)
plt.axis("off")
plt.show()
完整代码暂不放出。
效果展示
输入图像

输出图像

而在实际的使用过程中,我们把相同的人脸放在同一个文件夹中,并准备进行后续的操作。
例子:

对于类似的图片流,我们或许可以用一些技术手段来做一些面向未来的事情~!
边栏推荐
- Detailed explanation of STP election (step + case)
- Static routing + PAT + static NAT (explanation + experiment)
- Software Testing Defect Reporting - Definition, Composition, Defect Lifecycle, Defect Tracking Post-Production Process, Defect Tracking Process, Purpose of Defect Tracking, Defect Management Tools
- mysql 索引
- leetcode-399:除法求值
- Maximum monthly salary of 20K?The average salary is nearly 10,000... What is the experience of working in a Huawei subsidiary?
- [WeChat applet] This article takes you to understand data binding, event binding, event parameter transfer, and data synchronization
- [1154]如何将字符串转换为datetime
- Validate XML documents
- 静态路由+PAT+静态NAT(讲解+实验)
猜你喜欢

力扣刷题之有效的正方形(每日一题7/29)

How to design the changing system requirements

Can an inexperienced college graduate switch to software testing?my real case
![[Map and Set] LeetCode & Niu Ke exercise](/img/66/d812a6ad854cb0993c796760042150.png)
[Map and Set] LeetCode & Niu Ke exercise

Real-time image acquisition based on FPGA

VSCode Plugin: Nested Comments

coldfusion8后台计划任务拿shell

Introduction and use of Drools WorkBench

Teach you how to configure Jenkins automated email notifications

Inter-vlan routing + static routing + NAT (PAT + static NAT) comprehensive experiment
随机推荐
怎样做好一个创业公司CTO?
How to expose Prometheus metrics in go programs
汉诺塔问题
tcp框架需要解决的问题
最高月薪20K?平均薪资近万...在华为子公司工作是什么体验?
Observer mode (1)
coldfusion文件读取漏洞(CVE-2010-2861)
Real-time image acquisition based on FPGA
multiplayer-hlap 包有问题,无法升级的解决方案
两个有序数组间相加和的Topk问题
The real CTO is a technical person who understands products
pc端判断当前使用浏览器类型
[WeChat applet] This article takes you to understand data binding, event binding, event parameter transfer, and data synchronization
基于FPGA的图像实时采集
【Map与Set】之LeetCode&牛客练习
Nacos
The final exam first year course
[1154] How to convert string to datetime
1. Non-type template parameters 2. Specialization of templates 3. Explanation of inheritance
The comprehensive result of the case statement, do you know it?[Verilog Advanced Tutorial]