Add server for camera nodes.
This commit is contained in:
106
DecisionSystem/CentralisedDecision/cameraserver.py
Normal file
106
DecisionSystem/CentralisedDecision/cameraserver.py
Normal file
@@ -0,0 +1,106 @@
|
||||
from DecisionSystem.CentralisedDecision.ballotvoter import BallotVoter
|
||||
from DecisionSystem.CentralisedDecision.messenger import MqttMessenger
|
||||
import numpy as np
|
||||
import cv2
|
||||
import time
|
||||
import argparse
|
||||
import os.path
|
||||
import sys
|
||||
from GestureRecognition.simplehandrecogniser import SimpleHandRecogniser
|
||||
from threading import Thread
|
||||
from queue import Queue
|
||||
|
||||
parser = argparse.ArgumentParser(description="Runs a file with OpenCV and gets consensus from the swarm.")
|
||||
|
||||
parser.add_argument('-V', '--video', help="Path to video file.")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
recogniser = SimpleHandRecogniser(None)
|
||||
|
||||
# Checks if video file is specified and if that file exists.
|
||||
if(args.video):
|
||||
print('finding video')
|
||||
if not os.path.isfile(args.video):
|
||||
print("Input video file ", args.video, " doesn't exist")
|
||||
sys.exit(1)
|
||||
else:
|
||||
# Exit if no video file specified - we aren't using webcam here.
|
||||
sys.exit(1)
|
||||
|
||||
class VideoGet:
|
||||
'''
|
||||
Code taken from Najam R Syed, available here:
|
||||
https://github.com/nrsyed/computer-vision/tree/master/multithread
|
||||
'''
|
||||
def __init__(self, q, src):
|
||||
'''
|
||||
Must provide a source so we don't accidently start camera at work.
|
||||
'''
|
||||
self._stream = cv2.VideoCapture(src)
|
||||
(self.grabbed, self.frame) = self._stream.read()
|
||||
self.stopped = False
|
||||
self.q = q
|
||||
self.q.put(np.copy(self.frame))
|
||||
self.src = src
|
||||
|
||||
def start(self):
|
||||
Thread(target=self.get, args=()).start()
|
||||
return self
|
||||
|
||||
def get(self):
|
||||
while not self.stopped:
|
||||
if not self.grabbed:
|
||||
# self.stopped = True
|
||||
print('frame not grabbed')
|
||||
self._stream.release()
|
||||
self._stream = cv2.VideoCapture(self.src)
|
||||
# time.sleep(2)
|
||||
self.grabbed, self.frame = self._stream.read()
|
||||
else:
|
||||
(self.grabbed, self.frame) = self._stream.read()
|
||||
if self.q.full():
|
||||
self.q.get()
|
||||
self.q.put(np.copy(self.frame))
|
||||
time.sleep(0.03)
|
||||
# Start a new feed.
|
||||
|
||||
def stop(self):
|
||||
self.stopped = True
|
||||
|
||||
def on_vote():
|
||||
# Get the current frame of the camera and process what hand
|
||||
# is currently being seen.
|
||||
print('getting frame')
|
||||
# Need to copy rather than just take a reference, as frame will
|
||||
# constantly be changing.
|
||||
global vd
|
||||
recogniser.setFrame(np.copy(vd.frame))
|
||||
print('Got frame, voting with recogniser')
|
||||
return recogniser.get_gesture()
|
||||
|
||||
mqtt = MqttMessenger()
|
||||
v = BallotVoter(on_vote, mqtt)
|
||||
mqtt.connect()
|
||||
|
||||
# Start the video capture at the next whole minute.
|
||||
# current_time_sec = time.gmtime(time.time()).tm_sec
|
||||
# if current_time_sec < 40:
|
||||
# time.sleep(60 - current_time_sec)
|
||||
# else:
|
||||
# time.sleep(60 - current_time_sec + 60)
|
||||
print('loading video')
|
||||
|
||||
q = Queue(5)
|
||||
vd = VideoGet(q, args.video)
|
||||
vd.start()
|
||||
|
||||
stay_alive = input("Press q to stop, anything else to see what the camera is seeing.")
|
||||
|
||||
while stay_alive:
|
||||
if vd.frame is None:
|
||||
continue
|
||||
frame = np.copy(vd.frame)
|
||||
cv2.imshow('Frame', frame)
|
||||
cv2.waitKey(1) & 0xFF
|
||||
stay_alive = input("Press q to stop, anything else to see what the camera is seeing.")
|
||||
Reference in New Issue
Block a user