10 行代码的猫脸识别
2017-05-09

作为一个白天要上班的猫奴,如何做到不在主子的身边时也能和主子互动呢?
接下来,我就介绍一种利用 OpenCV (开源计算机视觉库)实现的猫脸识别应用。
开发环境:
- Python 2.7
- OpenCV 3.2
- Windows 10
由于OpenCV是由C++编写的,所以我们首先需要编译OpenVC,具体编译过程不再赘述,有需要的同学我可以直接提供编译好的文件。
接下来就是令人激动的编码啦!
import cv2
cascade_path = 'D:/AI/Face/haarcascades/haarcascade_frontalcatface_extended.xml'
frame = cv2.imread('cat_1.jpg')
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cascade = cv2.CascadeClassifier(cascade_path)
facerect = cascade.detectMultiScale(frame_gray, scaleFactor=1.2, minNeighbors=3, minSize=(10, 10))
if len(facerect) > 0:
for rect in facerect:
cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (255, 255, 255), thickness=2)
cv2.imwrite("cat_face.jpg", frame)
OK! 代码写完了!
什么?! 你确定没有骗我?
下面就让我细细道来每一行代码都发生了什么事情。
import cv2
屁啦! 上面这行不就是导入编译好的OpenCV文件?!下面这行呢?
cascade_path = 'D:/AI/Face/haarcascades/haarcascade_frontalcatface_extended.xml'
这一行是指定了我们要用的Haar分类器,这个分类器也是 OpenCV 预先训练好的,我们直接拿来用就可以啦!
frame = cv2.imread('cat_1.jpg')
用 OpenCV 来读取猫咪照片。
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
上面这行代码是将我们读取的猫咪照片转换为灰度图片。
cascade = cv2.CascadeClassifier(cascade_path)
这行是获取级联分类的特征量。
facerect = cascade.detectMultiScale(frame_gray, scaleFactor=1.2, minNeighbors=3, minSize=(10, 10))
这一行就是猫咪脸部识别的执行!
if len(facerect) > 0:
判断识别结果,如果 facerect>0 就是在照片里识别到猫脸啦!
for rect in facerect:
遍历facerect。
cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (255, 255, 255), thickness=2)
上面这一行是将猫脸在图片中的位置用白色线画出来。frame就是读取的原始图片,(255, 255, 255)即为白色,thickness 顾名思义就是白色线的宽厚度。
cv2.imwrite("cat_face.jpg", frame)
最后这步是将我们标记了猫咪脸部位置的照片保存下来。
怎么样?是不是非常简单?当然了,因为很多操作都是我们看不见的,要深入搞清楚这10行代码具体发生了什么,可是需要下一番功夫的哦。
我们上面的介绍是将具体怎么样在一张图片中识别出猫的步骤给大家演示了,那么该怎样识别视频中的猫呢?
我们知道,其实视频也是由一帧一帧的画面快速播放来实现运动效果的,所以可以明确一件事情:视频就是无数张图片。那么我们对每张图片分别来进行猫脸识别,是不是就可以做到实时读取摄像头画面来进行即时的猫脸识别?
是的,就是这样。在下一篇,我会专门介绍如何实时识别摄像头视频中猫的出现。
再见啦。