数人 1
怎么根据一张照片数人头呢?
文心一言如此说:
1、pip install opencv-python
要标记图片中的人头数并输出总人数,我们可以使用Python中的opencv库结合一个预训练的人脸检测模型。这里,将使用opencv自带的Haar特征分类器进行人脸检测。
安装有问题:python版本问题,使用pip3 install opencv-python可以
2、jupyter 运行
import cv2
def detect_faces(image_path):
# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 读取图片
img = cv2.imread(image_path)
# 转换为灰度图,因为Haar特征分类器需要灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 在图片上标记人脸
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示标记了人脸的图片
cv2.imshow('Faces found', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 输出总人数
print(f"Total number of faces detected: {len(faces)}")
return len(faces)
# 使用示例
image_path = 'D:\\小实验\\数人头\\少儿编程-20240821.jpg'
detect_faces(image_path)
以上代码执行有问题,尝试后发现 图片路径不能含汉字
再次执行可以了,但是cv2.imshow 显示的图片太大,不好看标记的人脸
所以改成这样了
import cv2
import matplotlib.pyplot as plt
def detect_faces(image_path):
# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 读取图片
img = cv2.imread(image_path)
# 检查图像是否加载成功
if img is None:
print(f"Error: Unable to load image at {image_path}")
return 0
# 转换为灰度图,因为Haar特征分类器需要灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
print(f"Total number of faces detected: {len(faces)}")
# 在图片上标记人脸
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示标记了人脸的图片
#cv2.imshow('Faces found', img)
plt.figure(figsize=(20, 16))
plt.imshow(img)
plt.show()
#cv2.waitKey(0)
#cv2.destroyAllWindows()
# 输出总人数
print(f"Total number of faces detected: {len(faces)}")
return len(faces)
# 使用示例
image_path = 'd:\\202408212.jpg'
detect_faces(image_path)
但是效果很差,这张图片只检测到三张脸