用python实现监控视频人数统计
作者:xiao__run 发布时间:2022-04-03 16:01:31
标签:python,视频人数,统计
目录
一、图示
二、准备
三、一个简单服务器应用
四、向服务器发送图片
五、最终关键yolov5调用代码:
一、图示
客户端请求输入一段视频或者一个视频流,输出人数或其他目标数量,上报给上层服务器端,即提供一个http API调用算法统计出人数,最终http上报总人数
二、准备
相关技术 python pytorch opencv http协议 post请求
Flask
Flask是一个Python实现web开发的微框架,对于像我对web框架不熟悉的人来说还是比较容易上手的。
Flask安装
sudo pip install Flask
三、一个简单服务器应用
为了稍微了解一下flask是如何使用的,先做一个简单的服务器例子。
第一个文件hello.py。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return 'hello world!'
@app.route("/python")
def hello_python():
return 'hello python!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
app.run(host=‘0.0.0.0')表示现在设定的ip为0.0.0.0,并且设定为0.0.0.0是非常方便的,如果你是在一台远程电脑上设置服务器,并且那台远程电脑的ip是172.1.1.1,那么在本地的电脑上可以设定ip为172.1.1.1来向服务器发起请求。
@app.route('/')表示发送request的地址是http://0.0.0.0:5000/,@app.route("/python")表示发送requests的地址为http://0.0.0.0:5000/python。
第二个文件是request.py
import requests
url = 'http://0.0.0.0:5000/'
r = requests.get(url)
print(r.status_code)
print(r.text)
url = 'http://0.0.0.0:5000/python'
r = requests.get(url)
print(r.status_code)
print(r.text)
四、向服务器发送图片
服务器代码
#coding:utf-8
from flask import request, Flask
import os
app = Flask(__name__)
@app.route("/", methods=['POST'])
def get_frame():
upload_file = request.files['file']
old_file_name = upload_file.filename
file_path = os.path.join('/local/share/DeepLearning', 'new' + old_file_name)
if upload_file:
upload_file.save(file_path)
print "success"
return 'success'
else:
return 'failed'
if __name__ == "__main__":
app.run("0.0.0.0", port=5000)
客户端代码
import requests
url = "http://0.0.0.0:5000"
filepath='./t2.jpg'
split_path = filepath.split('/')
filename = split_path[-1]
print(filename)
file = open(filepath, 'rb')
files = {'file':(filename, file, 'image/jpg')}
r = requests.post(url,files = files)
result = r.text
print result
这种情况长传图片是最快的,比用opencv先打开后传递象素级的数字要快很多.
五、最终关键yolov5调用代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/2/20 18:19
# @Author : xiaorun
# @Site :
# @File : yoloDetect.py
# @Software: PyCharm
import sys
import threading
from threading import Thread
import time
import os
import cv2
from yolo import YOLO5
import json,jsonify
import requests
import flask
from flask import request
headers = {'Content-Type': 'application/json'}
url_addr="http://123.206.106.55:8065/api/video/getPersonNum/"
# 创建一个服务,把当前这个python文件当做一个服务
server = flask.Flask(__name__)
server.debug = True
def gen_detector(url_video):
yolo = YOLO5()
opt = parseData()
yolo.set_config(opt.weights, opt.device, opt.img_size, opt.conf_thres, opt.iou_thres, True)
yolo.load_model()
camera = cv2.VideoCapture(url_video)
# 读取视频的fps, 大小
fps = camera.get(cv2.CAP_PROP_FPS)
size = (camera.get(cv2.CAP_PROP_FRAME_WIDTH), camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
print("fps: {}\nsize: {}".format(fps, size))
# 读取视频时长(帧总数)
total = int(camera.get(cv2.CAP_PROP_FRAME_COUNT))
print("[INFO] {} total frames in video".format(total))
ret, frame = camera.read()
if ret==False:
video_parameter = {"accessKey": "1C7C48F44A3940EBBAQXTC736BF6530342",
"code": "0000",
"personNum": "video problem.."}
response = requests.post(url=url_addr, headers=headers, data=json.dumps(video_parameter))
print(response.json())
max_person=0
while total>0:
total=total-1
ret,frame=camera.read()
if ret == True:
objs = yolo.obj_detect(frame)
if max_person<=len(objs):
max_person=len(objs)
for obj in objs:
cls = obj["class"]
cor = obj["color"]
conf = '%.2f' % obj["confidence"]
label = cls + " "
x, y, w, h = obj["x"], obj["y"], obj["w"], obj["h"]
cv2.rectangle(frame, (int(x), int(y)), (int(x + w), int(y + h)), tuple(cor))
cv2.putText(frame, label, (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1, cor, thickness=2)
person = "there are {} person ".format(len(objs))
cv2.putText(frame, person, (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), thickness=3)
video_parameter = {"accessKey": "1C7C48F44A3940EBBAQXTC736BF6530342",
"code": "0000",
"personNum": str(max_person)}
if total==0:
response = requests.post(url=url_addr, headers=headers, data=json.dumps(video_parameter))
print(response.json())
cv2.imshow("test",frame)
if cv2.waitKey(1)==ord("q"):
break
@server.route('/video', methods=['post'])
def get_video():
if not request.data: # 检测是否有数据
return ('fail..')
video_name= request.data.decode('utf-8')
# 获取到POST过来的数据,因为我这里传过来的数据需要转换一下编码。根据晶具体情况而定
video_json = json.loads(video_name)
print(video_json)
accessKey=video_json["accessKey"]
if accessKey=="1C7C48F44A3940EBBAQXTC736BF6530342":
code=video_json["code"]
url_video=video_json["url"]
print(url_video)
gen_detector(url_video)
# 把区获取到的数据转为JSON格式。
data_return={"code":200,"data":url_video,"message":"请求成功","sucsess":"true"}
return json.dumps(data_return)
else:
pass
# 返回JSON数据。
if __name__ == '__main__':
server.run(host='192.168.1.250', port=8888)
客户端请求测试:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/5/12 15:12
# @Author : xiaorun
# @Site :
# @File : test_post.py
# @Software: PyCharm
import requests,json
headers = {'Content-Type': 'application/json'}
user_info = {"accessKey":"1C7C48F44A3940EBBAQXTC736BF6530342",
"code":"N000001",
"url":"http:xxxx/video/xxxx.mp4"
}
r = requests.post("http://8.8.9.76:8888/video",headers=headers, data=json.dumps(user_info))
print (r.text)
来源:https://blog.csdn.net/xiao__run/article/details/117026393


猜你喜欢
- 这篇文章主要介绍了Python 切分数组实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- 学校让我们在放假期间自觉Python,对于Python我是小白的不能再小白了。一切从头开始,找学习资料,看视频教程光看书看视频也不行还要自己
- cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def__iter__())和生成器(yield)的MySQLdb
- 前言在日常开发中,客户端上传文件的一般流程是:客户端向服务端发送文件,再由服务端将文件转储到专门的存储服务器或云计算厂商的储存服务(例如阿里
- 不得不承认,傲游在用户体验方面是做得比较好的,所以它的用户群非常大。也正因为如此,它的某些不好的特性也造成了开发人员不可忽略的浏览器兼容问题
- Python元字典字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集
- PyTorch上的常用数据类型如下Data typedtypeCPU tensorGPU tensorSize/bytes32-bit fl
- 一.什么是RedisRedis是一个非关系型数据库,具有很高的存取性能,一般用作缓存数据库,减少正常存储数据库的压力。Redis可以存储键与
- 如下所示:l = [1, 2, 3, 5]l_one = [2, 8, 6, 10]print set(l) & set(l_one
- 什么是编码规范编码规范就是指导如何编写和组织代码的一系列标准。通过阅读这些编码规范,你可以知道在各个公司里代码是如何编写的。我们为什么需要编
- 本篇文章主要介绍了Python基于mysql实现学生管理系统,分享给大家,具体如下:import pymysqlimport redef i
- Mysql可以通过运算符来对表中数据进行运算,比如通过出生日期求年龄等运算符包括四类,分别是:算数运算符、比较运算符、逻辑运算符和位运算符算
- 1. 文件夹结构指定文件夹:E:/Code/Python/test指定文件:test.txt指定文件夹下的目录及文件:文件夹a:a.txtt
- Dreamweaver出现乱码,大致为两种情况:一是没有标明主页制作所用的文字,这种情况下很简单就可以
- 我们使用 python setup.py install 来安装python包,但是如何卸载呢?只能手动删除安装的文件可以使用如下命令pyt
- Psyco 是严格地在 Python 运行时进行操作的。也就是说,Python 源代码是通过 python 命令编译成字节码的,所用的方式和
- 本文实例讲述了PHP类的特性。分享给大家供大家参考,具体如下:对象向下传递特性当一个对象调用一个实例方法,然后在该方法中又去静态调用另一个类
- 数据库的表Info,表部分结构:Info_Id  
- 1、引言选择排序里面主要讲了三个排序,分别是简单选择排序、树形选择排序、堆排序。今天这篇文章主要讲树形选择排序,树形选择排序也被称为锦标赛排
- 场景一:A网站全站均为UTF-8编码,B网站全站为GB2312编码。A网站提供一段JS代码供B网站调用,该代码会动态生成一个FORM表单,以