-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver.py
More file actions
217 lines (180 loc) · 7.05 KB
/
server.py
File metadata and controls
217 lines (180 loc) · 7.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
from flask import Flask, render_template
from flask import request
from flask import Response
from flask import stream_with_context
from multiprocessing import Queue
import cv2
import dlib
import time
import queue
import imutils
import platform
import numpy as np
# AI models
from models.BlinkDetect import blinkDetect
from models.posenet import poseDetect # <=================================Jetson Environment======================================
from threading import Thread
# ====================전역 변수 선언====================
app = Flask(__name__)
capture = None
updateThread = None
readThread = None
width = 320
height = 240
cameraOn = False
streamQueueChecked = False
streamQueue = queue.Queue(maxsize=128)
Q = queue.Queue(maxsize=128)
poseEstimationChecked = False
frequentlyMoveChecked = False
blinkDetectionChecked = False
motionFrameQueue = Queue(maxsize=128)
# main page
@app.route('/')
def index():
global streamQueueChecked
global streamQueue
# Empty the streamQueue if streamQueueChecked is True
if streamQueueChecked :
print('Stream Queue is Cleared')
streamQueueChecked = False
with streamQueue.mutex :
streamQueue.queue.clear()
return render_template('index.html',
FaceCoverBlanketRemoveState='ON' if poseEstimationChecked else 'OFF',
FrequentlyMoveState='ON' if frequentlyMoveChecked else 'OFF',
AwakeState='ON' if blinkDetectionChecked else 'OFF')
# streaming page
@app.route('/stream_page')
def stream_page():
global streamQueueChecked
streamQueueChecked = True
return render_template('stream.html',
FaceCoverBlanketRemoveState='ON' if poseEstimationChecked else 'OFF',
FrequentlyMoveState='ON' if frequentlyMoveChecked else 'OFF',
AwakeState='ON' if blinkDetectionChecked else 'OFF')
# stream function
@app.route('/stream')
def stream() :
try :
return Response(
stream_with_context(stream_gen()),
mimetype='multipart/x-mixed-replace; boundary=frame'
)
except Exception as e :
print('[Badger]', 'stream error : ', str(e))
# setting page
@app.route('/setting')
def setting():
return render_template('setting.html')
# setting post function
@app.route('/setting_post', methods=['POST'])
def settingPost() :
global poseEstimationChecked
global frequentlyMoveChecked
global blinkDetectionChecked
if request.method == 'POST' :
poseEstimationChecked = str(request.form.get('PoseEstimation')) == 'on'
frequentlyMoveChecked = str(request.form.get('FrequentlyMove')) == 'on'
blinkDetectionChecked = str(request.form.get('BlinkDetection')) == 'on'
print('MODE : ', poseEstimationChecked, frequentlyMoveChecked, blinkDetectionChecked)
return render_template('index.html',
FaceCoverBlanketRemoveState='ON' if poseEstimationChecked else 'OFF',
FrequentlyMoveState='ON' if frequentlyMoveChecked else 'OFF',
AwakeState='ON' if blinkDetectionChecked else 'OFF')
# camera post function
@app.route('/camera_post', methods=['POST'])
def camerapost() :
if request.method == 'POST' :
on = str(request.form.get('CameraOn')) == 'on'
off = str(request.form.get('CameraOff')) == 'off'
if on and not cameraOn :
print('========================================Camera ON=========================================')
runCam(0)
elif off and cameraOn :
print('========================================Camera OFF========================================')
stopCam()
return render_template('index.html',
FaceCoverBlanketRemoveState='ON' if poseEstimationChecked else 'OFF',
FrequentlyMoveState='ON' if frequentlyMoveChecked else 'OFF',
AwakeState='ON' if blinkDetectionChecked else 'OFF')
# ===========================================================================================================================
# ====================================================== Function Area ======================================================
# ===========================================================================================================================
# 웹페이지에 바이트 코드를 이미지로 출력하는 함수
def stream_gen() :
while True :
frame = bytescode()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
# 카메라 시작 함수
def runCam(src=0) :
global capture
global cameraOn
global updateThread
global readThread
stopCam()
if platform.system() == 'Windows' :
capture = cv2.VideoCapture(src, cv2.CAP_DSHOW)
else :
capture = cv2.VideoCapture(src)
capture.set(cv2.CAP_PROP_FRAME_WIDTH, width)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
if updateThread is None :
print('Update Thread Start')
updateThread = Thread(target=updateVideoFrame, args=(), daemon=False)
updateThread.start()
if readThread is None :
print('Read Thread Start')
readThread = Thread(target=readVideoFrame, args=(), daemon=False)
readThread.start()
cameraOn = True
# 카메라 중지 함수
def stopCam() :
global cameraOn
cameraOn = False
if capture is not None :
capture.release()
clearVideoFrame()
# 영상 데이터를 실시간으로 Queue에 update하는 Thread 내용, 전역변수 cameraOn이 False면
# 빈 while문 진행
def updateVideoFrame() :
while True :
if cameraOn :
(ret, frame) = capture.read()
if ret :
Q.put(frame)
if streamQueueChecked :
streamQueue.put(frame)
if frequentlyMoveChecked :
motionFrameQueue.put(frame)
if blinkDetectionChecked :
blinkDetect(frame)
if poseEstimationChecked :
poseDetect(frame)
# 영상 데이터를 실시간으로 Queue에서 read하는 Thread 내용, 전역변수 cameraOn이 False면
# 빈 while문 진행
def readVideoFrame() :
while True :
if cameraOn :
frame = Q.get()
# Queue에 있는 영상 데이터를 삭제하는 함수
def clearVideoFrame() :
with Q.mutex :
Q.queue.clear()
# 검은화면을 출력하는 함수
def blankVideo() :
return np.ones(shape=[height, width, 3], dtype=np.uint8)
# 이미지 데이터를 바이트 코드로 변환하는 함수
def bytescode() :
frame = streamReadFrame()
if capture is None or frame is None or not capture.isOpened():
frame = blankVideo()
else :
frame = imutils.resize(frame, width=int(width))
return cv2.imencode('.jpg', frame)[1].tobytes()
def streamReadFrame() :
if cameraOn :
return streamQueue.get()
else :
return None