用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 相关文章推荐
python3.0 字典key排序
Dec 24 Python
python中的hashlib和base64加密模块使用实例
Sep 02 Python
Python中if __name__ == '__main__'作用解析
Jun 29 Python
教大家玩转Python字符串处理的七种技巧
Mar 31 Python
python中dir()与__dict__属性的区别浅析
Dec 10 Python
Python算法的时间复杂度和空间复杂度(实例解析)
Nov 19 Python
将python安装信息加入注册表的示例
Nov 20 Python
Python 中如何实现参数化测试的方法示例
Dec 10 Python
解决pycharm安装第三方库失败的问题
May 09 Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
python3读取文件指定行的三种方法
May 24 Python
Python基础之进程详解
如何在C++中调用Python
May 21 #Python
python 定义函数 返回值只取其中一个的实现
May 21 #Python
Python+Appium实现自动抢微信红包
写好Python代码的几条重要技巧
windows安装python超详细图文教程
python如何正确使用yield
May 21 #Python
You might like
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
jquery异步请求实例代码
2011/06/21 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
js中日期的加减法
2015/05/06 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
通过实例解析python and和or使用方法
2020/11/14 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
商铺租房协议书范本
2014/12/04 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
勤俭节约主题班会
2015/08/13 职场文书
七年级英语教学反思
2016/02/15 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript
vue实现登陆页面开发实践
2022/05/30 Vue.js