【学习记录】Opencv人脸检测项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本人只是一个小白,本次内容是用于学习记录用,经常有些东西忘记,不如直接写篇内容帮助自己巩固,欢迎各位大佬对我的内容进行批评与指正。也欢迎讨论。如有侵权,我删文并道歉。

一、准备工作

用的是python,装好python版本环境,用到是opencv,用pip直接安装

pip install opencv-python

二、基础教学

1.显示图片

首先准备好图片。然后显示即可,发现会很快消失,所以我们让他等待即可。最后销毁全部窗口。如果需要指定哪个窗口销毁的话,可以使用cv.desroyWindows()指定销毁窗口。

代码如下:

import cv2 as cv
img=cv.imread('face2.jpeg')
cv.imshow('read_img',img)
cv.waitKey(0)#等待
cv.destroyAllWindows()#销毁窗口

结果如下:


2.灰度图片

在正常中,可以用灰度图来减少计算成本,这是很重要的,有些函数也只能使用灰度图。所以我们需要将我们的原图转化为灰度图。顺带介绍如何保存图片。

灰度转化:cv.cvtColor(对象,cv.COLOR_BGR2GRAY)

代码如下:

import cv2 as cv
img=cv.imread('face2.jpeg')
cv.imshow('BGR_img',img)
gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('gray_img',gray_img)
#保存图片
cv.imwrite('gray.jpg',gray_img)
cv.waitKey(0)
cv.destroyAllWindows()

结果:

3.绘制

这里我们需要在图片画出一个矩形,这个可以用来圈出我们的人脸,用函数就是

矩形:cv.rectangle(img,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)

其中xy就是框的上角坐标,(x+w,y+h,会不会是下角坐标捏,作者也不知道,猜的,写文章的作用就体现了,)

color就是颜色,opencv中是BGR排列,所以使用的就是绿色。

thickness就是线条的粗细。

圆:cv.circle(img,center=(x,y),radius=r,color=(0,255,0),thickness=2)

与上述一致,xy是中心点,r是半径

代码如下:

import cv2 as cv
img=cv.imread('face2.jpeg')
#画矩形
x,y,w,h=50,50,50,50
cv.rectangle(img,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)
#绘制圆center元组指原点的坐标
x1,y1,r=75,75,25
cv.circle(img,center=(x1,y1),radius=r,color=(0,255,0),thickness=2)
cv.imshow('rectangle',img)
cv.waitKey(0)

结果如下:

4.人脸检测

1、Haar特征

Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。(听不懂。我也听不懂。感觉像是对于边缘变化,然后判断标准,重申,个人想法不肯定,不确定,不负责)

简单学习用的人脸检测,我们可以直接下载opencv官网的特征。网站如下:

https://opencv.org/releases/

随便下载一个对应操作系统的版本吧。然后我们使用里面的haar特征,在文件的这里

D:\谷歌下载\opencv\build\etc\haarcascades

使用这个基础默认的,其他一些是根据眼睛,鼻子之类的去识别人脸的

2,CascadeClassifier—级联分类器

介绍:它可以帮助我们检测例如车牌、眼睛、人脸等物体。它的大概原理就是判别某个物体是否属于某个分类。以人脸为例,我们可以把眼睛、鼻子、眉毛、嘴巴等属性定义成一个分类器,如果检测到一个模型符合定义人脸的所有属性,那么就认为它是一个人脸。接下来我们就逐步实现。

 face_detector= cv.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml')

操作:将那个默认的,后缀名为.xml的分类器-->传入函数。

3,调用detectMultiScale()函数进行检测。

faces= face_detector.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=3) 

scaleFactor->调整尺寸, minNeighbors->检测几次才能确认,小了误检,大了漏检

记住一定要灰度传入减少计算。(可以原图吗????

4,绘制人脸框

在3中使用函数可以返回x,y,w,h,也就是坐标点和宽高。我们只需要进行遍历,取出xywh,在结合绘制,不就画出人脸框了嘛,(图再看一边,重新拿过来用,嘻嘻)

代码如下:

import cv2 as cv
def face_detector_demo():
    gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    face_detector= cv.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml')
    #scaleFactor->可以缩放比例, minNeighbors->检测几次才能确认
    faces= face_detector.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=3) #可以调整
    for x,y,w,h in faces:
        print(x,y,w,h)
        cv.rectangle(img,(x,y),(x+w,y+h),color=(0,255,0),thickness=2)
       # cv.circle(resizes_img,center=(x+w//2,y+h//2),radius=w//2,color=(0,0,255),thickness=2)#画圆

    cv.imshow('result',img)
img= cv.imread('face2.jpeg')
face_detector_demo()

cv.waitKey(0)

,结果如下:

结果惨不忍睹,为什么识别不到中间的人,这个时候可以稍微调整一下,例如检测次数,或者尺寸比例调一调。

调整后:

你也不能说没圈到吧,就能不能去掉后面的观众捏,是可以的。我们可以看出来,后面观众的宽高较小,代码中我也打印出来了w,h,我们完全可以让他消失,看看自己打印数据调节哈。

我这里差不多是60-80,我们设置minsize为(80,80)就可以去掉观众了

detectMultiScale函数中可以调节

faces= face_detector.detectMultiScale(gray,scaleFactor=1.07,minNeighbors=5,minSize=(80,80)) 

(这种思路是不是可以用作近景和远景区别捏,甚至可以确定一个人脸框正确的矫正位置,让人自行调整与摄像头的距离。作者的bb系列)

5.人脸识别

原先的太low了,作者学到更好的再来写文章。

总结

第一次写,写比较有趣点,有什么写什么,就跟写小说一样,如果能帮到你,我很荣幸。

文章纯属小白文,喜欢能有大佬点评点评,祝各位能开开心心的。嘻嘻

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值