263 lines
11 KiB
Python
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() |