当前位置: 首页 > news >正文

使用python-opencv检测图片中的人像

最简单的方法进行图片中的人像检测

使用python-opencv配合yolov3模型进行图片中的人像检测

1、安装python-opencv、numpy

pip install opencv-python
pip install numpy 

2、下载yolo模型文件和配置文件:

下载地址:

 https://download.csdn.net/download/mldxs/88396654yicon-default.png?t=N7T8https://download.csdn.net/download/mldxs/88396654

yolo官网:

YOLO: Real-Time Object DetectionYou only look once (YOLO) is a state-of-the-art, real-time object detection system.icon-default.png?t=N7T8https://pjreddie.com/darknet/yolo/3、搬砖:代码比较简单并且带注释,不过多介绍

import cv2
import numpy as np# 读取输入图像
image = cv2.imread('input.jpeg')# 加载YOLOv3模型和类别标签
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')
classes = []
with open('coco.data', 'r') as f:classes = f.read().strip().split('\n')# 获取YOLO模型的输出层名称
layer_names = net.getLayerNames()
output_layers = []
unconnected_layers = net.getUnconnectedOutLayers()# 根据输出层索引获取输出层名称
for i in unconnected_layers:output_layers.append(layer_names[i - 1])# 为每个类别生成随机颜色
colors = np.random.uniform(0, 255, size=(len(classes), 3))# 获取图像的尺寸
height, width, channels = image.shape# 创建YOLO模型的输入blob
blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)# 将blob设置为模型的输入
net.setInput(blob)
outs = net.forward(output_layers)class_ids = []
confidences = []
boxes = []# 处理YOLO模型的输出
for out in outs:for detection in out:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]# 如果置信度大于0.5并且类别是"person"(0对应COCO数据集中的"person"类)if confidence > 0.5 and class_id == 0:center_x = int(detection[0] * width)center_y = int(detection[1] * height)w = int(detection[2] * width)h = int(detection[3] * height)x = int(center_x - w / 2)y = int(center_y - h / 2)boxes.append([x, y, w, h])confidences.append(float(confidence))class_ids.append(class_id)# 使用非极大值抑制获取最终的检测结果
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
margin = 30  # 定义边框扩展的边距大小# 绘制边框和类别标签
for i in range(len(boxes)):if i in indexes:x, y, w, h = boxes[i]label = str(classes[class_ids[i]])color = colors[i]# 扩展边框的坐标x_new = max(0, x - margin)y_new = max(0, y - margin)w_new = min(image.shape[1], w + 2 * margin)h_new = min(image.shape[0], h + 2 * margin)# 绘制扩展后的边框cv2.rectangle(image, (x_new, y_new), (x_new + w_new, y_new + h_new), color, 2)cv2.putText(image, label, (x_new, y_new - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)# 显示带有边框的图像
cv2.imshow('Detected Bodies', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

最终效果:

yolo有很多检测类别,上述代码只对人像进行检测,就是检测类别里的第一项(person)

http://www.lryc.cn/news/182961.html

相关文章:

  • 项目进展(三)-电机驱动起来了,发现了很多关键点,也遇到了一些低级错误,
  • 目标检测算法改进系列之Backbone替换为RepViT
  • 学习 Kubernetes的难点和安排
  • 【MATLAB源码-第42期】基于matlab的人民币面额识别系统(GUI)。
  • 【软件测试】软件测试的基础概念
  • Docker-mysql,redis安装
  • 五种I/O模型
  • 用nativescript开发ios程序常用命令?
  • 6.Tensors For Beginners-What are Convector
  • Linux多线程网络通信
  • 矩阵的c++实现(2)
  • RPC 框架之Thrift入门(一)
  • 【C++】运算符重载 ⑥ ( 一元运算符重载 | 后置运算符重载 | 前置运算符重载 与 后置运算符重载 的区别 | 后置运算符重载添加 int 占位参数 )
  • 538. 把二叉搜索树转换为累加树
  • java8日期时间工具类
  • 算法-动态规划/trie树-单词拆分
  • React框架核心原理
  • python-pytorch 利用pytorch对堆叠自编码器进行训练和验证
  • 制作 3 档可调灯程序编写
  • 源码分享-M3U8数据流ts的AES-128解密并合并---GoLang实现
  • CSDN Q: “这段代码算是在STC89C52RC51单片机上完成PWM呼吸灯了吗?“
  • Linux系统编程系列之线程池
  • Linux CentOS7 vim多文件与多窗口操作
  • SPI 通信协议
  • 【图像处理】使用各向异性滤波器和分割图像处理从MRI图像检测脑肿瘤(Matlab代码实现)
  • 5个适合初学者的初级网络安全工作,网络安全就业必看
  • Kafka核心原理
  • 探秘前后端开发世界:猫头虎带你穿梭编程的繁忙街区,解锁全栈之路
  • 洛谷_分支循环
  • MySQL数据库入门到精通——进阶篇(3)