数人 opencv - 技术笔记

数人 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)

但是效果很差,这张图片只检测到三张脸

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值