/usr/lib/python3/dist-packages/ginga/cvw/ImageViewCv.py is in python3-ginga 2.6.1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 109 110 111 112 113 114 115 116 117 118 | #
# ImageViewCv.py -- a backend for Ginga using OpenCv surfaces
#
# This is open-source software licensed under a BSD license.
# Please see the file LICENSE.txt for details.
import numpy
from io import BytesIO
import cv2
from . import CvHelp
from ginga import ImageView
from ginga.cvw.CanvasRenderCv import CanvasRenderer
try:
import PIL.Image as PILimage
have_PIL = True
except ImportError:
have_PIL = False
class ImageViewCvError(ImageView.ImageViewError):
pass
class ImageViewCv(ImageView.ImageViewBase):
def __init__(self, logger=None, rgbmap=None, settings=None):
ImageView.ImageViewBase.__init__(self, logger=logger,
rgbmap=rgbmap,
settings=settings)
self.surface = None
# According to OpenCV documentation:
# "If you are using your own image rendering and I/O functions,
# you can use any channel ordering. The drawing functions process
# each channel independently and do not depend on the channel
# order or even on the used color space."
#self._rgb_order = 'BGRA'
self._rgb_order = 'RGBA'
self.renderer = CanvasRenderer(self)
def get_surface(self):
return self.surface
def render_image(self, rgbobj, dst_x, dst_y):
"""Render the image represented by (rgbobj) at dst_x, dst_y
in the pixel space.
"""
if self.surface is None:
return
canvas = self.surface
self.logger.debug("redraw surface")
# get window contents as an array and store it into the CV surface
rgb_arr = self.getwin_array(order=self._rgb_order)
# TODO: is there a faster way to copy this array in?
canvas[:,:,:] = rgb_arr
# for debugging
#self.save_rgb_image_as_file('/tmp/temp.png', format='png')
def configure_surface(self, width, height):
# create cv surface the size of the window
# (cv just uses numpy arrays!)
depth = len(self._rgb_order)
self.surface = numpy.zeros((height, width, depth), numpy.uint8)
# inform the base class about the actual window size
self.configure(width, height)
def get_image_as_array(self):
if self.surface is None:
raise ImageViewCvError("No OpenCv surface defined")
arr8 = self.get_surface()
return numpy.copy(arr8)
def get_rgb_image_as_buffer(self, output=None, format='png', quality=90):
if not have_PIL:
raise ImageViewCvError("Please install PIL to use this method")
if self.surface is None:
raise ImageViewCvError("No CV surface defined")
obuf = output
if obuf is None:
obuf = BytesIO()
# make a PIL image
image = PILimage.fromarray(self.surface)
image.save(obuf, format=format, quality=quality)
return obuf
def update_image(self):
# subclass implements this method to actually update a widget
# from the cv surface
self.logger.warning("Subclass should override this method")
return False
def set_cursor(self, cursor):
# subclass implements this method to actually set a defined
# cursor on a widget
self.logger.warning("Subclass should override this method")
def reschedule_redraw(self, time_sec):
# subclass implements this method to call delayed_redraw() after
# time_sec
self.delayed_redraw()
def get_rgb_order(self):
return self._rgb_order
#END
|