赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
本人只是一个小白,本次内容是用于学习记录用,经常有些东西忘记,不如直接写篇内容帮助自己巩固,欢迎各位大佬对我的内容进行批评与指正。也欢迎讨论。如有侵权,我删文并道歉。
用的是python,装好python版本环境,用到是opencv,用pip直接安装
pip install opencv-python
首先准备好图片。然后显示即可,发现会很快消失,所以我们让他等待即可。最后销毁全部窗口。如果需要指定哪个窗口销毁的话,可以使用cv.desroyWindows()指定销毁窗口。
代码如下:
- import cv2 as cv
- img=cv.imread('face2.jpeg')
- cv.imshow('read_img',img)
- cv.waitKey(0)#等待
- cv.destroyAllWindows()#销毁窗口
结果如下:
在正常中,可以用灰度图来减少计算成本,这是很重要的,有些函数也只能使用灰度图。所以我们需要将我们的原图转化为灰度图。顺带介绍如何保存图片。
灰度转化: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()
结果:
这里我们需要在图片画出一个矩形,这个可以用来圈出我们的人脸,用函数就是
矩形: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)
结果如下:
Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。(听不懂。我也听不懂。感觉像是对于边缘变化,然后判断标准,重申,个人想法不肯定,不确定,不负责)
简单学习用的人脸检测,我们可以直接下载opencv官网的特征。网站如下:
随便下载一个对应操作系统的版本吧。然后我们使用里面的haar特征,在文件的这里
D:\谷歌下载\opencv\build\etc\haarcascades
使用这个基础默认的,其他一些是根据眼睛,鼻子之类的去识别人脸的
介绍:它可以帮助我们检测例如车牌、眼睛、人脸等物体。它的大概原理就是判别某个物体是否属于某个分类。以人脸为例,我们可以把眼睛、鼻子、眉毛、嘴巴等属性定义成一个分类器,如果检测到一个模型符合定义人脸的所有属性,那么就认为它是一个人脸。接下来我们就逐步实现。
face_detector= cv.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml')
操作:将那个默认的,后缀名为.xml的分类器-->传入函数。
faces= face_detector.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=3)
scaleFactor->调整尺寸, minNeighbors->检测几次才能确认,小了误检,大了漏检
记住一定要灰度传入减少计算。(可以原图吗????
在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系列)
原先的太low了,作者学到更好的再来写文章。
第一次写,写比较有趣点,有什么写什么,就跟写小说一样,如果能帮到你,我很荣幸。
文章纯属小白文,喜欢能有大佬点评点评,祝各位能开开心心的。嘻嘻
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。