用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实现获取网站PR及百度权重
Jan 21 Python
Python代码调试的几种方法总结
Apr 15 Python
python中sleep函数用法实例分析
Apr 29 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
在django admin详情表单显示中添加自定义控件的实现
Mar 11 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
Python实战之实现康威生命游戏
Apr 26 Python
Pytorch使用shuffle打乱数据的操作
May 20 Python
Python基础之进程详解
如何在C++中调用Python
May 21 #Python
python 定义函数 返回值只取其中一个的实现
May 21 #Python
Python+Appium实现自动抢微信红包
写好Python代码的几条重要技巧
windows安装python超详细图文教程
python如何正确使用yield
May 21 #Python
You might like
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
php 中的str_replace 函数总结
2007/04/27 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
JavaScript的Cookies
2008/01/16 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
对python中的pop函数和append函数详解
2018/05/04 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
毕业生找工作的求职信范文
2013/12/24 职场文书
股权收购意向书
2014/04/01 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
售后服务承诺函格式
2015/01/21 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
二年级作文之动物作文
2019/11/13 职场文书
React四级菜单的实现
2022/04/08 Javascript