基于opencv的人脸检测

Posted 咋_T细胞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于opencv的人脸检测相关的知识,希望对你有一定的参考价值。

目录

引言

一、代码

二、运行效果

三、代码解读

四、一些思考


引言

这篇文章,让你用短短的16行代码基于opencv检测一张图片上的人脸,很有意思,快快学起来吧!

一、代码

先将代码直接粘在下面:

import cv2 as cv


def face_detect_demo(img):
    img = cv.resize(img, dsize=(800, 800))
    gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    face_detect = cv.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
    face = face_detect.detectMultiScale(gary, 1.004, 28, 0, (40, 40), (50, 50))
    for x, y, w, h in face:
        cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 225), thickness=4)
    cv.imshow("result", img)
    # img.save("result.jpg")  # 保存图片
    cv.imwrite(r"final_result.jpg", img)

img = cv.imread("photo.jpg")
face_detect_demo(img)  # 检测单个图片

while True:
    if ord("q") == cv.waitKey(1):
        break
cv.destroyAllWindows()

二、运行效果

原图片:

识别之后的图片(得自己调参): 

 

三、代码解读

  • 首先导入我们所需要的必要包opencv,对应指令为import cv2 as cv,这里的as就相当于给这个模块起了个别名。如果读者opencv还没有安装的话,可以在终端里面pip install opencv,还不行的话可以看看这个教程:Opencv安装小白教程
  • 首先,我们定义一个函数face_detect_demo,这个函数有一个参数img,即我们要检测的图片,这是一个形参。
  • 调用cv里面的函数resize,改变图片的大小。resize第一个参数是要处理的图片,第二个参数是你想要改成图片的大小,这里的(800,800)就是改成800*800的这样一张图片。处理的结果再返回给img,当然,如果你喜欢的话也可以另外设一个变量,传进去。
  • 接下来更改图片颜色,直接调用cvtColor函数,同样,第一个参数是要处理的图片,第二个参数是要更改的颜色类型,这里的颜色类型有很多种,我这里设置的是COLOR_BGR2GRAY类型。
  • 前两步,你可以理解为将图片标准化,即传入不同大小,不同颜色的图片可以转化成同一大小,同一颜色类型的图片。这样的操作好处在于后面调参数更容易。
  • 重头戏来了!,这是opencv官方已经训练好的一个人脸检测模型,直接调用就可以,非常方便!文章最后有文件和代码提取链接,也有一些其他训练好的模型,如果感兴趣的话你也可以试一试其他模型。
  • 接着,我们检测图片中的人脸,face_detect.detectMultiScale,就是调用模型里面的detectMultiScale。第一个参数gray是要处理的图片,第二个参数是,第三个参数28意思是检测的时候,30次都在同一个位置检测到人脸;这个值高,模型就需要反复验证。第四个参数是。第五个参数是最小矩形框大小,第六个参数是最大矩形框大小。这六个参数需要自己去调,以求最佳匹配。detectMultiScale方法会直接用该模型检测图片,并返回多个x,y,w,h。(x,y)是左顶点的坐标,w是矩形框的宽度,h是矩形框的高度。
  • for循环的功能就是在原来的图片上面绘制矩形框啦,对应的函数是cv.rectangle,这里面的参数很简单就不一一介绍了。
  • cv.imshow进行展示,cv.imwrite进行保存,注意imwrite保存图片时,命名要加上.jpg
  • 函数到此结束,接下来是调用函数:
  • 首先读取图片,由于我把程序和图片放在一个文件夹,可以直接用名字去读,如果你没有放在一个文件家里面,要用绝对路径去读取。
  • 调用上面写好的函数去检验人脸
  • 最后做一个键盘的关联事件退出,,按下键盘q键会退出循环,程序结束。别忘了用cv.destroyAllWindows销毁所以窗口哦。

四、一些思考

我感觉这是一个很有意思的demo,虽然没有什么技术含量,没有数据获取,数据处理,数据训练,模型验证…但是,他能让我们看到cv的强大,如果计算机视觉没有opencv,很多简单的功能将变得复杂,当opencv+openmv,我们能做很多我们感兴趣的事。

回到这个人脸检测里面去,为什么叫人脸检测不叫人脸识别呢?因为这个demo只能够知道图片里有几个人,至于他们到底分别是谁就没有办法知道了。

如果加上神经网络又会怎么样呢?比如现在我有A这个人的大量图片,用神经网络进行训练,让计算机能够认出他。那么在一张合照里面,计算机能够很快认出哪个是A,并把他框选出来。

那么到底有什么用呢?畅想未来:

现在有很多重要犯罪嫌疑人逍遥法外,如果能将他的人脸数据训练出来的模型传到全国各地的摄像头中,无论在哪,只要摄像头检测到他的人脸就把地址信息发回警局,这样是不是就能即使抓捕他。

儿童拐卖同样是一个社会热点,现在也有很多网站在帮助找被拐卖的儿童。父母主要是通过网站上上传的照片去猜测这到底是不是他的孩子。但是很多照片都是孩子被拐卖两三年甚至五年十年之后的照片了,就连是亲生父母都很难辨认。如果能用深度学习,强化学习,根据小时候的照片训练出来的模型去匹配网站上的照片,将匹配结果高的反馈给父母,这样父母和子女是不是更容易重逢呢?当然这只是我的猜想。

人脸作为我们的生物密码给我们带来了不少便利,比如说手机一键解锁,支付宝一键支付,各种门禁刷脸进入。“刷脸”逐渐渗透到我们生活,我们的人脸数据不断传入互联网中,互联网的数据库越来越丰富,对应背后的产业链也越来越发达,面部识别并不是一项全新的技术,但人工智能和机器学习不断使面部识别变得更强大。

文件链接:

https://pan.baidu.com/s/1FV3NWT3Vayq3eKq2QsB3mg?pwd=tsvd 
提取码:tsvd

以上是关于基于opencv的人脸检测的主要内容,如果未能解决你的问题,请参考以下文章

opencv 人脸识别 训练样本的处理

opencv怎么把一张图片上的人头框出来,(假设该图片上只有一个人)

基于OpenCV的视频处理 - 人脸检测

基于OpenCV读取摄像头进行人脸检测和人脸识别

OpenCV基于残差网络实现人脸检测

OpenCV基于残差网络实现人脸检测