def _processor_startup_fn(pull_port, push_port, sockets_connected_evt, process_fn, event_queue, debug): bridge = Bridge(debug=debug) push_socket = bridge._connect_push(pull_port) pull_socket = bridge._connect_pull(push_port) if debug: print('image processing sockets connected') sockets_connected_evt.set() def process_and_sendoff(image_tags_tuple): if len(image_tags_tuple) != 2: raise Exception('If image is returned, it must be of the form (pixel, metadata)') if not image_tags_tuple[0].dtype == pixels.dtype: raise Exception('Processed image pixels must have same dtype as input image pixels, ' 'but instead they were {} and {}'.format(image_tags_tuple[0].dtype, pixels.dtype)) processed_img = {'pixels': serialize_array(image_tags_tuple[0]), 'metadata': image_tags_tuple[1]} push_socket.send(processed_img) while True: message = None while message is None: message = pull_socket.receive(timeout=30) #check for new message if 'special' in message and message['special'] == 'finished': push_socket.send(message) #Continue propagating the finihsed signal push_socket.close() pull_socket.close() return metadata = message['metadata'] pixels = deserialize_array(message['pixels']) image = np.reshape(pixels, [metadata['Height'], metadata['Width']]) params = signature(process_fn).parameters if len(params) == 2 or len(params) == 4: processed = None try: if len(params) == 2: processed = process_fn(image, metadata) elif len(params) == 4: processed = process_fn(image, metadata, bridge, event_queue) except Exception as e: warnings.warn('exception in image processor: {}'.format(e)) continue else: raise Exception('Incorrect number of arguments for image processing function, must be 2 or 4') if processed is None: continue if type(processed) == list: for image in processed: process_and_sendoff(image) else: process_and_sendoff(processed)
def _processor_startup_fn(pull_port, push_port, sockets_connected_evt, process_fn, event_queue, debug): """ Parameters ---------- pull_port : push_port : sockets_connected_evt : process_fn : event_queue : debug : Returns ------- """ bridge = Bridge(debug=debug) push_socket = bridge._connect_push(pull_port) pull_socket = bridge._connect_pull(push_port) if debug: print("image processing sockets connected") sockets_connected_evt.set() def process_and_sendoff(image_tags_tuple, original_dtype): """ Parameters ---------- image_tags_tuple : Returns ------- """ if len(image_tags_tuple) != 2: raise Exception( "If image is returned, it must be of the form (pixel, metadata)" ) pixels = image_tags_tuple[0] metadata = image_tags_tuple[1] # only accepts same pixel type as original if not np.issubdtype(image_tags_tuple[0].dtype, original_dtype) and not np.issubdtype( original_dtype, image_tags_tuple[0].dtype): raise Exception( "Processed image pixels must have same dtype as input image pixels, " "but instead they were {} and {}".format( image_tags_tuple[0].dtype, pixels.dtype)) metadata[ "PixelType"] = "GRAY8" if pixels.dtype.itemsize == 1 else "GRAY16" processed_img = { "pixels": pixels.tobytes(), "metadata": metadata, } push_socket.send(processed_img) while True: message = None while message is None: message = pull_socket.receive(timeout=30) # check for new message if "special" in message and message["special"] == "finished": push_socket.send( message) # Continue propagating the finihsed signal push_socket.close() pull_socket.close() return metadata = message["metadata"] pixels = deserialize_array(message["pixels"]) image = np.reshape(pixels, [metadata["Height"], metadata["Width"]]) params = signature(process_fn).parameters if len(params) == 2 or len(params) == 4: processed = None try: if len(params) == 2: processed = process_fn(image, metadata) elif len(params) == 4: processed = process_fn(image, metadata, bridge, event_queue) except Exception as e: warnings.warn("exception in image processor: {}".format(e)) continue else: raise Exception( "Incorrect number of arguments for image processing function, must be 2 or 4" ) if processed is None: continue if type(processed) == list: for image in processed: process_and_sendoff(image, pixels.dtype) else: process_and_sendoff(processed, pixels.dtype)