放假回来,闲着翻了下电脑看见一个人脸识别的Demo   照着做了下,遇到了一些小麻烦,好在做出来了,挺有意思。

说一下环境:

android人脸位置检测_图像识别

安装好了Tensorflow   Pycharm  等环境,在网上看到了这份代码


然后复制到Pycharm中,虚拟环境我设置为 

android人脸位置检测_图像识别_02

Inherit global site-packages继承了全局的虚拟环境,这样不用每个包都安装一遍了,缺哪个包再单独安装

下面是源代码

 

import cv2
pathofeye='/home/apollo/pan/cv2/data/haarcascades/haarcascade_eye.xml'
pathoffront='/home/apollo/pan/cv2/data/haarcascades/haarcascade_frontalface_default.xml'

'''
这里注意一定要用全路径   否则报错  error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
具体参照   
我从网上下载了cv2  (https://github.com/opencv/opencv)  这里面包含了分类器模型haarcascade_eye.xml等 我保存的位置是
/home/apollo/pan/cv2/data/haarcascades/ 一定要能寻找到分类器模型

'''


faceCascade = cv2.CascadeClassifier(pathoffront)

image = cv2.imread(r"time.jpg")  #读取图片   这里可以加一个判断,否则没有读取到图片还会引起其他莫名其妙的错误

size = image.shape
h, w = size[0], size[1]  #获取图片的大小   后续我根据这个比例缩放


print (h,w)   #打印大小


gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.2,
minNeighbors=5, minSize=(30, 30),)
for (x, y, width, height) in faces:
    cv2.rectangle(image, (x, y), (x + width, y + height), (0, 255, 0), 2)
    im2 = cv2.resize(image, (int(w*0.55), int(h*0.55)), interpolation=cv2.INTER_CUBIC)  
 # int(w*0.55), int(h*0.55)是按照55%的比例缩放,注意这个参数只接受整数,这里需要转换一下
    cv2.imshow("Face", im2)
cv2.waitKey(0)  #注意  这里的等待要放在for循环外面  否则识别会有卡顿 这句为了防止图片一闪而过

 

 

识别结果(找了一张小姐姐多的图片试验)

android人脸位置检测_人脸识别_03

时间长不学习,突然学点东西感觉挺充实的

android人脸位置检测_cv2_04

 

 

今天(24,Feb )更新一下:由于我昨天弄了一个项目,那个库给我更新了全局的numpy  ,然后我又懒直接从全局创建了一个一个项目,然后复制进去代码,结果尴尬了…… 一直显示这个错误python-opencv:ImportError: numpy.core.multiarray failed to import, 装逼失败对于我来说无法忍受。弄了一下午,Python 都折腾了一遍3.7  3.6  最后郁闷的出去吃串(吐槽一下,作为一个守旧的人真的讨厌软件,库频繁更新,有的程序员刷尼玛存在感,更新的越来越垃圾有意思么?各种不兼容!我的理念是软件系统什么的稳定最好,有一种什么软件,系统都要最新的我比较讨厌)  

回归原题,我今天找了很久原因,大部分都归结于与numpy这个万恶之源的版本兼容问题,于是我把opencv-python 和numpy卸载,然后在pip install opencv-python 然后这个软件给我附赠了numpy版本1.16 

android人脸位置检测_图像识别_05

我新建了一个Pycharm 然后照样继承全局环境Inherit-global  运行结果问题照旧,于是我孤注一掷,开始折腾numpy版本,先安装到1.9  出现的问题是module compiled against API version 0xa but this version of numpy is 0x9   然后我又安装1.12.0这次终于成功。有看到久违的小姐姐们,好开心

android人脸位置检测_图像识别_06

总结下经验就是,版本未必新就好,未必旧就好,合适兼容是王道。这也是python设计虚拟环境的原因吧(虽然我没太弄懂环境间的关系),不过python各种包版本兼容问题确实很坑爹,又没法调试,只能求助,碰运气摸索。我在Pycharm更改了numpy版本,并未影响pip中版本。numpy真是万恶之源,但是我搞不懂为什么opencv-python会把两个不兼容的包打包???

以后自己写程序最好把关键的包版本号附上  方便其他人用的时候调整版本

android人脸位置检测_人脸识别_07

升级版 能批量识别