用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写一个windows下的定时关机脚本(推荐)
Mar 21 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
对python列表里的字典元素去重方法详解
Jan 21 Python
selenium+python环境配置教程详解
May 28 Python
python中自带的三个装饰器的实现
Nov 08 Python
python tornado使用流生成图片的例子
Nov 18 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
Python django框架开发发布会签到系统(web开发)
Feb 12 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
Python3如何判断三角形的类型
Apr 12 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
深入解析NumPy中的Broadcasting广播机制
May 30 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日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
php自动获取关键字的方法
2015/01/06 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
PHP中error_reporting函数用法详细介绍
2017/06/11 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
js 调整select 位置的函数
2008/02/21 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
Django实现快速分页的方法实例
2017/10/22 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
python使用Matplotlib画条形图
2020/03/25 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
django实现模型字段动态choice的操作
2020/04/01 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
应届生.NET方向面试题
2015/05/23 面试题
普通员工辞职信
2014/01/17 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python