forked from iplayfast/zoidberg
-
Notifications
You must be signed in to change notification settings - Fork 2
/
image_server.py
108 lines (72 loc) · 2.73 KB
/
image_server.py
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
import cv2 as cv
import messenger
from config_manager import ConfigManager
from shared import attach
from utils import RecognitionState
listener_wrapper = messenger.CallbackListenerWrapper()
node = messenger.Node('image_server')
settings_change = messenger.Listener('/settings_changed', messenger.Messages.string, callback=listener_wrapper.update)
visualizer = None
def recognition_callback(*args):
package = recognition_listener.package
if package and visualizer:
visualizer.recognition = RecognitionState.from_dict(package)
def strategy_callback(*args):
package = strategy_listener.package
if package and visualizer:
visualizer.gamestate = package
recognition_listener = messenger.Listener(
'/recognition', messenger.Messages.string, callback=recognition_callback)
strategy_listener = messenger.Listener(
'/strategy', messenger.Messages.string, callback=strategy_callback)
from gevent import monkey
monkey.patch_all(thread=False)
from time import sleep
from flask import Flask, Response
from collections import deque
from camera.visualization import Visualizer
logger = node.logger
# Queue messages from bootstrap
log_queue = deque(maxlen=1000)
websockets = set()
app = Flask(__name__)
config = ConfigManager.get_value('camera')
visualizer = Visualizer(config)
def generator(type_str):
visualizer.type_str = type_str
while True:
sleep(0.250) # Fix this stupid thingie
if visualizer.jpeg:
yield b'--frame\r\nContent-Type: image/jpeg\r\n\r\n'
yield visualizer.jpeg
yield b'\r\n\r\n'
def realsense_generator(type_str):
image = attach("shm://depth-color")
while True:
sleep(0.050) # Fix this stupid thingie
try:
ret, jpeg = cv.imencode('.jpg', image, (cv.IMWRITE_JPEG_QUALITY, 80))
buf = jpeg.tostring()
except Exception as e:
logger.error_throttle(1, f"{e}")
continue
yield b'--frame\r\nContent-Type: image/jpeg\r\n\r\n'
yield buf
yield b'\r\n\r\n'
@app.route('/combined/<path:type_str>')
def video_combined(type_str):
return Response(generator(type_str.upper()), mimetype='multipart/x-mixed-replace; boundary=frame')
@app.route('/realsense')
def video_realsense():
return Response(realsense_generator(), mimetype='multipart/x-mixed-replace; boundary=frame')
def main(silent=False):
from gevent import pywsgi
messenger.ConnectPythonLoggingToROS.reconnect('visualization', 'threading')
ip, port = ('0.0.0.0', 5005)
server = pywsgi.WSGIServer((ip, port), app)
visualizer.thread.start()
logger.info("Started IMAGE server at http://{}:{}".format(ip, port))
server.start()
node.spin()
if __name__ == '__main__':
main()