放假回来,闲着翻了下电脑看见一个人脸识别的Demo 照着做了下,遇到了一些小麻烦,好在做出来了,挺有意思。
说一下环境:
安装好了Tensorflow Pycharm 等环境,在网上看到了这份代码
然后复制到Pycharm中,虚拟环境我设置为
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循环外面 否则识别会有卡顿 这句为了防止图片一闪而过
识别结果(找了一张小姐姐多的图片试验)
时间长不学习,突然学点东西感觉挺充实的
今天(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
我新建了一个Pycharm 然后照样继承全局环境Inherit-global 运行结果问题照旧,于是我孤注一掷,开始折腾numpy版本,先安装到1.9 出现的问题是module compiled against API version 0xa but this version of numpy is 0x9 然后我又安装1.12.0这次终于成功。有看到久违的小姐姐们,好开心
总结下经验就是,版本未必新就好,未必旧就好,合适兼容是王道。这也是python设计虚拟环境的原因吧(虽然我没太弄懂环境间的关系),不过python各种包版本兼容问题确实很坑爹,又没法调试,只能求助,碰运气摸索。我在Pycharm更改了numpy版本,并未影响pip中版本。numpy真是万恶之源,但是我搞不懂为什么opencv-python会把两个不兼容的包打包???
以后自己写程序最好把关键的包版本号附上 方便其他人用的时候调整版本
升级版 能批量识别