又发现一条喵星人将要统治地球的新线索(OpenCV识别猫脸)

原文链接: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)

效果还不错,躲在天线上都能被你们发现。

再换几张包含喵星人和汪星人的图片试试:

这个非常满意,没有把我们喵星人当成粗鲁的汪星人。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注