about 2 months ago

1.遇到问题

先放上人脸识别代码

import cv2  # 计算机视觉包

# 认得人脸长什么样子
# 人脸识别中的默认分类器,主要用于人脸图片中的人脸轮廓的识别
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")


def detect(gray, frame):
    # 处理黑白画面,用人脸1.3倍大小的框标识出人脸,线条宽带5像素
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    # 指定画框框的位置
    for (x, y, w, h) in faces:  # 扫描整张图片
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = frame[y:y + h, x:x + w]
    return frame  # 把处理完的整张照片,回传


video_capture = cv2.VideoCapture(0)
while True:
    # 读取摄像头采集到的画面
    _, frame = video_capture.read()
    # 把画面转成黑白,在opencv中处理颜色的顺序是“蓝绿红”
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    canvas = detect(gray, frame)  # 把结果展示在画布上面
    cv2.imshow("Video", canvas)  # 把结果展示出来

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

video_capture.release()
cv2.destroyAllWindows()

运行时出现报错

Traceback (most recent call last)
<ipython-input-6-9cceee0010e9> in <module>
      3     _, frame = video_capture.read() # 读取摄像头采集到的画面
      4     gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 把画面转成黑白,在opencv中处理颜色的顺序是“蓝绿红”
----> 5     canvas = detect(gray,frame) # 把结果展示在画布上面
      6     cv2.imshow("Video",canvas) # 把结果展示出来
      7 

<ipython-input-5-0d22d3377ae6> in detect(gray, frame)
     12             cv2.rectangle(roi_color,(ex, ey), (ex+ew, ey+eh),(0,255,0),2)
     13 
---> 14         smiles = smile_cascade.detectMultiScale(roi_gray,1.7,22)
     15         for (sx, sy, sw, sh) in smiles: # 扫描整张图片
     16             cv2.rectangle(roi_color,(sx, sy), (sx+sw, sy+sh),(0,0,255),2)

error: OpenCV(3.4.3) /Users/travis/build/skvark/opencv-python/opencv/modules/objdetect/src/cascadedetect.cpp:1698: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'

2.查找原因

经过分析报错信息和一番搜索,发现主要问题出现在第二行代码
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
程序在当前文件夹搜索分类器haarcascade_frontalface_default.xml,但是却没有找到,因此需要指定该分类器的绝对路径
经过全盘搜索,发现电脑上并没有该分类器,需要自行到互联网下载

3.解决问题:单独下载人脸识别分类器

官方解决方案是到github上下载opencv到所有库文件,结果令人乍舌

(ai) lee$:git clone https://github.com/lyy1988323/opencv.git
Cloning into 'opencv'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (25/25), done.
Receiving objects:   0% (427/245503), 124.01 KiB | 114.00 KiB

整个库文件有24.5万个文件,下载极为缓慢而且冗余,遂考虑仅仅下载需要到人脸识别分类器文件

问题就转变成如何下载github的一个文件或者文件夹
经过搜索,发现有各种解决方案:web版,chrome插件,命令行工具等
于是,选择了最简单的web解决方案:
打开后右上角输入需要下载的github的一个文件或者文件夹url:https://github.com/opencv/opencv/tree/master/data/haarcascades
然后点击右侧Download即可

参考资料:
GitHub/opencv
GitHub部分文件下载
Download a single folder or directory from a GitHub repo

← 【深度学习】TensorBoard初次开启报错 pip 更新国内多个镜像源 →