Files
Intelligent-Elderly-Care/Class/detection/Live_Tool.py
2020-08-02 11:29:42 +08:00

263 lines
11 KiB
Python

import os
import queue
import threading
import time
from numba import cuda
import cv2
import sys
import platform
import subprocess as sp
from sys import platform
from datetime import datetime
from model import create_model
from websocket import create_connection
from Camera_Beside_Com import Face_Register
from Camera_In_Room import Face_Recognizer
from Calibration_On_Desk import Calibration
from Camera_In_Hall import Fall_Detection
from Camera_On_Desk import Interaction_Detection
from Camera_In_Yard import Intrusion_Detection
class Live(object):
def __init__(self):
self.cap = cv2.VideoCapture(0)
# opencv dnn 人脸检测器
self.detector = cv2.dnn.readNetFromCaffe("data/data_opencv/deploy.prototxt.txt",
"data/data_opencv/res10_300x300_ssd_iter_140000.caffemodel")
# facenet model
self.nn4_small2 = create_model()
self.nn4_small2.load_weights('weights/nn4.small2.v1.h5')
# websocket 连接服务器
self.ws = create_connection("ws://192.144.229.49:8000/api/websocket/cameraLink")
self.frame_queue = queue.Queue()
self.rtmpUrl = "rtmp://39.97.124.237:1984/wodelive"
self.camera_path = "test4.mp4"
# 人脸搜集
self.Face_Register_on = Face_Register(people_type=1, id='3')
# 微笑检测
self.Face_Recognizer_on = Face_Recognizer(self.detector, self.nn4_small2)
# 与义工交互 距离标定和颜色标定
self.scale = -1
self.Calibration_on = Calibration()
self.Interaction_on = Interaction_Detection(detector=self.detector, nn4_small2=self.nn4_small2)
# 摔倒检测
self.transfer_flag = False
self.trigger = False
self.Fall_Detection_on = None
# 入侵检测
self.net = cv2.dnn.readNetFromCaffe('data/data_opencv/MobileNetSSD_deploy.prototxt',
'data/data_opencv/MobileNetSSD_deploy.caffemodel')
self.Intrusion_Detection_on = Intrusion_Detection(self.net)
# 视频记录
self.fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
self.out = cv2.VideoWriter('output.avi', self.fourcc, 20, (640, 480))
# Get video information
self.fps = 30 # 设置帧速率
width = 640 # 宽
height = 480 # 高
# ffmpeg command
self.command = ['ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', "{}x{}".format(width, height),
'-r', str(self.fps),
'-i', '-',
'-c:v', 'libx264',
'-pix_fmt', 'yuv420p',
'-preset', 'slow',
'-f', 'flv',
self.rtmpUrl]
self.recieve = {"todo": "reboot"}
# self.recieve = {"todo": "change", 'data': {'fuc': '1'}}
self.transfer_flag = False
self.take = False
# if trigger:
# cuda.select_device(0) # 选择GPU设备
# cuda.close() # 释放GPU资源
def read_frame(self):
# 根据不同的操作系统,设定读取哪个摄像头
if platform == 'Linux': # 如果是Linux系统
cap = cv2.VideoCapture(10) # 绑定编号为10的摄像头
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(3, 640) # 设置摄像头画面的宽
cap.set(4, 480) # 设置摄像头画面的高
elif platform == 'Darwin': # 如果是苹果的OS X系统
cap = cv2.VideoCapture(0) # 绑定编号为0的摄像头
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
cap.set(3, 640)
cap.set(4, 480)
else: # windows系统
cap = cv2.VideoCapture(0) # 绑定编号为0的摄像头
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
# cap.set(3, 640)
# cap.set(4, 480)
# read webcamera
counter = 0
pre = datetime.now()
while cap.isOpened():
counter += 1
if counter <= 10:
continue
ret, frame = cap.read()
if not ret:
self.cap = cv2.VideoCapture(0)
ret, frame = self.cap.read()
self.transfer_flag = False
# put frame into queue
now = datetime.now()
self.frame_queue.put(frame)
# if self.recieve["todo"] == "change":
# if self.recieve["data"]["fuc"] == "1":
# # Get video information
# self.fps = 5 # 设置帧速率
# width = 640 # 宽
# height = 480 # 高
#
# # ffmpeg command
# self.command = ['ffmpeg',
# '-y',
# '-f', 'rawvideo',
# '-vcodec', 'rawvideo',
# '-pix_fmt', 'bgr24',
# '-s', "{}x{}".format(width, height),
# '-r', str(self.fps),
# '-i', '-',
# '-c:v', 'libx264',
# '-pix_fmt', 'yuv420p',
# '-preset', 'slow',
# '-f', 'flv',
# self.rtmpUrl]
#
# if (now - pre).total_seconds() > 0.14:
# self.frame_queue.put(frame)
# pre = now
# else:
# # Get video information
# self.fps = 20 # 设置帧速率
# width = 640 # 宽
# height = 480 # 高
#
# # ffmpeg command
# self.command = ['ffmpeg',
# '-y',
# '-f', 'rawvideo',
# '-vcodec', 'rawvideo',
# '-pix_fmt', 'bgr24',
# '-s', "{}x{}".format(width, height),
# '-r', str(self.fps),
# '-i', '-',
# '-c:v', 'libx264',
# '-pix_fmt', 'yuv420p',
# '-preset', 'slow',
# '-f', 'flv',
# self.rtmpUrl]
#
# self.frame_queue.put(frame)
# pre = now
# else:
# self.frame_queue.put(frame)
# pre = now
def push_frame(self):
# 防止多线程时 command 未被设置
while True:
if len(self.command) > 0:
# 管道配置
p = sp.Popen(self.command, stdin=sp.PIPE)
break
while True:
if not self.frame_queue.empty():
if self.frame_queue.qsize() > 100:
self.frame_queue.queue.clear()
continue
frame = self.frame_queue.get()
if self.recieve["todo"] == 'reboot':
pass
elif self.recieve["todo"] == 'entering':
people_type = self.recieve["data"]["type"] # 0代表老人,1代表员工,2代表义工
id = self.recieve["data"]["id"]
self.pretodo = 'entering'
if not self.take:
self.Face_Register_on = Face_Register(people_type, id)
self.take = True
frame = self.Face_Register_on.process(frame)
elif self.recieve["todo"] == 'takePhoto':
if self.recieve["data"]["fuc"] == 'shutter':
if self.take:
frame = self.Face_Register_on.take_photo(frame)
self.take = False
else:
frame = self.Face_Register_on.process(frame)
elif self.recieve["data"]["fuc"] == 'standard':
self.scale = self.Calibration_on.run(frame)
self.recieve = {"todo": "change", 'data': {'fuc': '2'}}
elif self.recieve["todo"] == 'change':
fuc = self.recieve["data"]["fuc"] # 更改的功能 0:无 1微笑检测 2交互检测 3摔倒检测 4禁区入侵
if fuc == '0':
self.out.write(frame)
elif fuc == '1':
frame = self.Face_Recognizer_on.process(frame)
elif fuc == '14':
if self.scale == -1:
pass
else:
frame = self.Interaction_on.process(frame, self.scale)
elif fuc == '3' and self.trigger:
if not self.transfer_flag:
self.cap = cv2.VideoCapture("test4.mp4")
ret, frame = self.cap.read()
self.transfer_flag = True
self.Fall_Detection_on = Fall_Detection()
# self.Fall_Detection_on.re_init()
frame = self.Fall_Detection_on.run(frame)
elif fuc == '4':
frame = self.Intrusion_Detection_on.process(frame)
p.stdin.write(frame.tobytes())
def get_result(self):
self.ws.send("Hello, World")
while True:
recieve = self.ws.recv()
print(eval(recieve))
self.recieve = eval(recieve)
if self.recieve['todo'] == 'takePhoto' and self.recieve['data']['fuc'] == 'shutter':
self.take = True
def release_gpu(self):
cuda.select_device(0) # 选择GPU设备
cuda.close() # 释放GPU资源
def run(self):
threads = [
threading.Thread(target=Live.read_frame, args=(self,)),
threading.Thread(target=Live.push_frame, args=(self,)),
threading.Thread(target=Live.get_result, args=(self,))
]
[thread.setDaemon(False) for thread in threads]
[thread.start() for thread in threads]
if __name__ == "__main__":
live = Live()
live.run()