error: empty() in function detectMultiScale
这个问题,stackoverflow上有一个完美的解决方案:error: (-215) !empty() in function detectMultiScale。
解决方案如下:
把
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
换成
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
即可。
亲测有效。
OpenCV 人脸识别
OpenCV内部提供了三种不同的训练好的级联分类器。
级联分类器的优势是,在开始阶段仅进行非常简单的判断,就能够排除明显不符合要求的实例。
但是,根据以下这张图的秒描述,OpenCV内部提供的这个算法是用的人提供的特征量,属于机器学习的范畴。
比如我用以下代码进行测试:
# 读取待检测的图像
image = cv2.imread('images/samsung.jpg')
# 获取XML文件,加载人脸检测器
# faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 色彩转换,转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 调用函数detectMultiScale
faces = face_cascade.detectMultiScale(
gray,
scaleFactor = 1.15,
minNeighbors = 5,
minSize = (5,5)
)
print(faces)
# 打印输出的测试结果
print("发现{0}个人脸!".format(len(faces)))
# 逐个标注人脸
for(x, y, w, h) in faces:
# cv2.rectangle(image, (x, y), (x+w, y+w), (0,255,0),2) #矩形标注
cv2.circle(image, (int((x+x+w)/2), int((y+y+h)/2)), int(w/2), (0,255,0),30)
# 显示结果
show(image)
# 保存检测结果
cv2.imwrite("re.jpg", image)
结果如下:
可以发现效果并不是很理想。