Source code for morse.middleware.sockets.video_camera
import sys
import json
import base64
import logging; logger = logging.getLogger("morse." + __name__)
from morse.middleware.socket_datastream import SocketPublisher
[docs]class VideoCameraPublisher(SocketPublisher):
""" Publish a base64 encoded RGBA image """
_type_name = 'base64 encoded RGBA image'
[docs] def process(self, image):
if sys.version_info < (3,4):
return bytes( image )
else:
# Python 3.4 base64.b64encode supports memoryview, which is faster
# TODO Blender 2.7 ? else: image = memoryview( image )
return image
[docs] def encode(self):
if not self.component_instance.capturing:
return bytes() # press [Space] key to enable capturing
image = self.process( self.data['image'] )
data = base64.b64encode( image ).decode() # get string
intrinsic = [ list(vec) for vec in self.data['intrinsic_matrix'] ]
res = {
'timestamp': self.data['timestamp'],
'height': self.component_instance.image_height,
'width': self.component_instance.image_width,
'image': data,
'intrinsic_matrix': intrinsic,
}
return (json.dumps(res) + '\n').encode()
[docs]class Video8uPublisher(VideoCameraPublisher):
""" Publish a base64 encoded grayscale (8U) image """
_type_name = 'base64 encoded grayscale (8U) image'
[docs] def process(self, image):
memv = memoryview( image )
# Grayscale model used for HDTV developed by the ATSC (Wikipedia)
i8u = [ int(0.2126 * memv[index] +
0.7152 * memv[index + 1] +
0.0722 * memv[index + 2] )
for index in range(0, len(memv), 4) ]
return bytearray( i8u )