原文链接:http://www.juzicode.com/opencv-python-cat-face-dectect
都说喵星人快要统治地球了,各种证据正在被发现……
OpenCV的开发人员似乎也发现了些什么,在其发布版本里悄悄留下了些线索:
在OpenCV-Python安装包目录的data文件夹下,有2个“frontcal cat face”文件,对比其他几个人脸识别的文件,从名称上可以推测出也是级联分类器,用来识别猫脸的,这明显是要为以后喵星人统治地球提前做技术储备呀。
为了以后更好地服务喵星人,我们来看看这些猫脸级联分类器怎么用。
第一步是在创建分类器对象的时候加载分类器文件,需要指明分类器文件的路径:
cascade_file = r"D:\Python\Python38\Lib\site-packages\cv2\data\haarcascade_frontalcatface.xml"
face_cascade = cv2.CascadeClassifier(cascade_file)
但是这种方法用起来不方便,不同的环境安装路径不一样,移植性差。我们可以打开data文件夹下的__init__.py看看:
import os
haarcascades = os.path.join(os.path.dirname(__file__), "")
可以看到haarcascades表示的就是data文件夹的路径,我们可以在自己的py文件中直接导入这个变量,生成级联分类器的路径:
import cv2
from cv2.data import haarcascades
cascade_file = haarcascades+"haarcascade_frontalcatface.xml"
print('cascade_file:',cascade_file)
运行结果:
cascade_file: D:\Python\Python38\lib\site-packages\cv2\data\haarcascade_frontalcatface.xml
接下来就是创建级联分类器实例:
face_cascade = cv2.CascadeClassifier(cascade_file)
然后就是读入图像,用detectMultiScale()方法检测猫,其中参数scaleFactor表示前后2次搜索时窗口的缩放比例,minSize表示搜索到猫脸的最小限制值:
img = cv2.imread("wifi-cat.jpg")
faces = face_cascade.detectMultiScale(img,scaleFactor= 1.1,minSize=(130, 130))
返回的faces是一个表示猫脸的矩形框列表,每个矩形框包括起始点x和y的坐标,以及w和h表示的宽度和高度,接下来就是框出找到的猫脸:
for ind,position in enumerate(faces):
print('position:',position)
(x, y, w, h) = position
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv2.putText(img,'Cat%d'%ind,(x,y-7), 3, 1.2, (0, 255, 0), 2, cv2.LINE_AA)
cv2.imshow('Cat', img)
cv2.waitKey(0)
效果还不错,躲在天线上都能被你们发现。
再换几张包含喵星人和汪星人的图片试试:
这个非常满意,没有把我们喵星人当成粗鲁的汪星人。