Module pantools.CameraClient
Expand source code
import struct
import imutils
from imutils.video import VideoStream
import time
from _thread import *
import pickle
import socket
import sys
import struct
from .TCPClient import TCPClient
from .logger import logger
from .send_recv import send_size, recv_size
# ================================================================
#
# ================================================================
class CameraClient():
def __init__(self, magic, port, picam=False) -> None:
self.frame_number = 1
self.picam = picam
self.magic = magic
self.port = port
self.tcp_client = TCPClient(magic, port)
if self.picam == True:
logger.debug("Using PI Camera!")
self.vs = VideoStream(usePiCamera=True).start()
else:
logger.debug("Using USB Camera!")
self.vs = VideoStream(usePiCamera=False).start()
time.sleep(2)
logger.debug("Camera varmed up!")
def start_client(self):
logger.debug("Camera Client start_client...")
self.tcp_client.start_client()
self.tcp_client.send_msg({
"message": "announce",
"msgtype": "admin",
"hostname": socket.gethostname()
})
start_new_thread(self.camera_thread, ())
def send_image(self, frame_number, frame) -> None:
msg = {
"message": "image",
"msgtype": "image",
"type": "json-object",
"threadname": "none",
"hostname": socket.gethostname(),
"frameno": frame_number,
"image": frame,
}
print(f"Sending message size: {get_size(msg)} where image {frame_number} of type {type(frame)} takes up {frame.size} bytes")
self.tcp_client.send_msg(msg)
def camera_thread(self):
logger.info("************ camera thread started **************")
try:
while True:
logger.info("Reading video frame")
fr = self.vs.read()
if fr is None:
logger.error("No current frame!")
else:
fr = fr.copy()
fr = imutils.resize(fr, width=512)
self.frame_number = self.frame_number + 1
frnum = self.frame_number
msg = {
"message": "image",
"msgtype": "image",
"type": "json-object",
"threadname": "none",
"hostname": socket.gethostname(),
"frameno": frnum,
"image": fr
}
self.tcp_client.send_msg(msg)
time.sleep(1)
except Exception as e:
logger.error("Exception in camera thread")
logger.error(str(e))
finally:
logger.info("Exiting camera_thread...")
def send_msg(self, msg):
self.tcp_client.send_msg(msg)
# blocking read!
def read_msg(self):
msg = self.tcp_client.read_msg()
return msg
def get_size(obj, seen=None):
"""Recursively finds size of objects"""
size = sys.getsizeof(obj)
if seen is None:
seen = set()
obj_id = id(obj)
if obj_id in seen:
return 0
# Important mark as seen *before* entering recursion to gracefully handle
# self-referential objects
seen.add(obj_id)
if isinstance(obj, dict):
size += sum([get_size(v, seen) for v in obj.values()])
size += sum([get_size(k, seen) for k in obj.keys()])
elif hasattr(obj, '__dict__'):
size += get_size(obj.__dict__, seen)
elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
size += sum([get_size(i, seen) for i in obj])
return size
Functions
def get_size(obj, seen=None)
-
Recursively finds size of objects
Expand source code
def get_size(obj, seen=None): """Recursively finds size of objects""" size = sys.getsizeof(obj) if seen is None: seen = set() obj_id = id(obj) if obj_id in seen: return 0 # Important mark as seen *before* entering recursion to gracefully handle # self-referential objects seen.add(obj_id) if isinstance(obj, dict): size += sum([get_size(v, seen) for v in obj.values()]) size += sum([get_size(k, seen) for k in obj.keys()]) elif hasattr(obj, '__dict__'): size += get_size(obj.__dict__, seen) elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)): size += sum([get_size(i, seen) for i in obj]) return size
Classes
class CameraClient (magic, port, picam=False)
-
Expand source code
class CameraClient(): def __init__(self, magic, port, picam=False) -> None: self.frame_number = 1 self.picam = picam self.magic = magic self.port = port self.tcp_client = TCPClient(magic, port) if self.picam == True: logger.debug("Using PI Camera!") self.vs = VideoStream(usePiCamera=True).start() else: logger.debug("Using USB Camera!") self.vs = VideoStream(usePiCamera=False).start() time.sleep(2) logger.debug("Camera varmed up!") def start_client(self): logger.debug("Camera Client start_client...") self.tcp_client.start_client() self.tcp_client.send_msg({ "message": "announce", "msgtype": "admin", "hostname": socket.gethostname() }) start_new_thread(self.camera_thread, ()) def send_image(self, frame_number, frame) -> None: msg = { "message": "image", "msgtype": "image", "type": "json-object", "threadname": "none", "hostname": socket.gethostname(), "frameno": frame_number, "image": frame, } print(f"Sending message size: {get_size(msg)} where image {frame_number} of type {type(frame)} takes up {frame.size} bytes") self.tcp_client.send_msg(msg) def camera_thread(self): logger.info("************ camera thread started **************") try: while True: logger.info("Reading video frame") fr = self.vs.read() if fr is None: logger.error("No current frame!") else: fr = fr.copy() fr = imutils.resize(fr, width=512) self.frame_number = self.frame_number + 1 frnum = self.frame_number msg = { "message": "image", "msgtype": "image", "type": "json-object", "threadname": "none", "hostname": socket.gethostname(), "frameno": frnum, "image": fr } self.tcp_client.send_msg(msg) time.sleep(1) except Exception as e: logger.error("Exception in camera thread") logger.error(str(e)) finally: logger.info("Exiting camera_thread...") def send_msg(self, msg): self.tcp_client.send_msg(msg) # blocking read! def read_msg(self): msg = self.tcp_client.read_msg() return msg
Methods
def camera_thread(self)
-
Expand source code
def camera_thread(self): logger.info("************ camera thread started **************") try: while True: logger.info("Reading video frame") fr = self.vs.read() if fr is None: logger.error("No current frame!") else: fr = fr.copy() fr = imutils.resize(fr, width=512) self.frame_number = self.frame_number + 1 frnum = self.frame_number msg = { "message": "image", "msgtype": "image", "type": "json-object", "threadname": "none", "hostname": socket.gethostname(), "frameno": frnum, "image": fr } self.tcp_client.send_msg(msg) time.sleep(1) except Exception as e: logger.error("Exception in camera thread") logger.error(str(e)) finally: logger.info("Exiting camera_thread...")
def read_msg(self)
-
Expand source code
def read_msg(self): msg = self.tcp_client.read_msg() return msg
def send_image(self, frame_number, frame) ‑> NoneType
-
Expand source code
def send_image(self, frame_number, frame) -> None: msg = { "message": "image", "msgtype": "image", "type": "json-object", "threadname": "none", "hostname": socket.gethostname(), "frameno": frame_number, "image": frame, } print(f"Sending message size: {get_size(msg)} where image {frame_number} of type {type(frame)} takes up {frame.size} bytes") self.tcp_client.send_msg(msg)
def send_msg(self, msg)
-
Expand source code
def send_msg(self, msg): self.tcp_client.send_msg(msg)
def start_client(self)
-
Expand source code
def start_client(self): logger.debug("Camera Client start_client...") self.tcp_client.start_client() self.tcp_client.send_msg({ "message": "announce", "msgtype": "admin", "hostname": socket.gethostname() }) start_new_thread(self.camera_thread, ())