用python实现监控视频人数统计


Posted in Python onMay 21, 2021

一、图示

用python实现监控视频人数统计
用python实现监控视频人数统计

客户端请求输入一段视频或者一个视频流,输出人数或其他目标数量,上报给上层服务器端,即提供一个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)

到此这篇关于用python实现监控视频人数统计的文章就介绍到这了,更多相关python视频人数统计内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python绘图方法实例入门
May 19 Python
在Python中操作列表之list.extend()方法的使用
May 20 Python
详解Python中的Cookie模块使用
Jul 06 Python
Python网络编程 Python套接字编程
Sep 13 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
django之自定义软删除Model的方法
Aug 14 Python
python随机数分布random均匀分布实例
Nov 27 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
使用pycharm运行flask应用程序的详细教程
Jun 07 Python
Python 一键获取电脑浏览器的账号密码
May 11 Python
Python基础之进程详解
如何在C++中调用Python
May 21 #Python
python 定义函数 返回值只取其中一个的实现
May 21 #Python
Python+Appium实现自动抢微信红包
写好Python代码的几条重要技巧
windows安装python超详细图文教程
python如何正确使用yield
May 21 #Python
You might like
程序员编程十条戒律
2009/07/09 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
yii添删改查实例
2015/11/16 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
JavaScript中的Math 使用介绍
2014/04/21 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
Javascript 之封装(Package)
2018/09/14 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
原生js实现碰撞检测
2020/03/12 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
python实现键盘控制鼠标移动
2020/11/27 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
python中if嵌套命令实例讲解
2021/02/25 Python
CSS3中background-clip和background-origin的区别示例介绍
2014/03/10 HTML / CSS
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
竞职演讲稿范文
2014/01/11 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
MySQL之DML语言
2021/04/05 MySQL
golang中的struct操作
2021/11/11 Golang