1.说明:windows7 64位 + python3.7 + idea2018社区版
2.首先是安装opencv,按照网上的说法都试了下,总结一下方法:
使用pip下载,在cmd中 输入
pip install opencv-python
pip install numpy
安装numpy和opencv,如图cv是3.4.3版本,numpy是1.15.4版本,
然后我还下载了opencv-contrib-python,这个是扩展包,也用pip就能下载。
然后去看idea,然后可能会发现imread上提示:Cannot find reference ‘imread’ in ‘init.py’ | cv2
这边你点击cv2看他的__init__文件能够看出他其实用的是cv2.cv2模块,所以这个提示没问题,能够运行(强迫症卡在这一步好久),网上看到的说法是python3版本高的问题(不确定)
import cv2
img = cv2.imread(image_path)
真正的代码在这:
3. 人脸识别
这边其实很简单,有现成的轮子:haar 人脸特征分类器
直接搜一下下载haarcascades
然后核心代码:
def detect_faces(image_path):
result = []
img = cv2.imread(image_path) # ndarray
# eye_cascade = cv2.CascadeClassifier("E:\py-file\py-pic\cvdata\haarcascades\haarcascade_eye_tree_eyeglasses.xml")
face_cascade = cv2.CascadeClassifier("E:\py-file\py-pic\cvdata\haarcascades\haarcascade_frontalface_alt.xml")
if img.ndim == 3:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 色彩空间的转换 BGR 2 GRAY
else:
gray = img # 如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果为2,原图就是灰度图
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=2, minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE)
for (x, y, width, height) in faces:
result.append((x, y, x + width, y + height))
return result
def draw_faces(image_path, new_path):
faces = detect_faces(image_path)
print("发现%d个" % len(faces))
if faces:
img = Image.open(image_path)
draw_instance = ImageDraw.Draw(img)
for (x1, y1, x2, y2) in faces:
draw_instance.rectangle((x1, y1, x2, y2), outline=(255, 0, 0)) # 矩形框,线宽不能改,fill表示填充内部
img.show()
# img.save(new_path)
faces就是所有人脸的位置(x,y,x+h,y+w),需要注意的是CascadeClassifier后面的路径需要是haarcascades完整的路径,frontalface_default.xml就是已经训练好的分类器,不过实测时候发现检测率不是很高,可能是图片的问题,人脸要大且清晰且正脸才能检测到。当然还有其他分类器可以使用:frontalface_alt和alt2检测率高一些。
---------------2018-12-07
1.更正一下,应该是人脸检测,人脸识别需要训练一个识别器然后使用
2.提供完整代码,detect_faces函数用于检测,返回人脸位置的列表,draw_faces用于画出位置(矩形框)
对于detectMultiScale的参数:
image:输入图像
scaleFactor:这个是每次缩小图像的比例,一般为1.1
minNeighbors:匹配成功所需要的周围矩形框的数目,比如人脸特征,周围要最少识别三次才能确认是人脸。
flags:可以取如下这些值:
CASCADE_DO_CANNY_PRUNING=1, 利用canny边缘检测来排除一些边缘很少或者很多的图像区域
CASCADE_SCALE_IMAGE=2, 正常比例检测
CASCADE_FIND_BIGGEST_OBJECT=4, 只检测最大的物体
CASCADE_DO_ROUGH_SEARCH=8 粗略的检测
minSize和maxSize:匹配物体的大小范围