在kivy上更新显示的图像

时间:2014-02-21 01:12:57

标签: image caching reload kivy

在更新了包含图像数据的两个JPG文件后,我在Kivy上自动更新了我的数据。 在我的最小/示例代码中,如果self.count为'1'或'0',我希望切换图像。

以下是我的示例代码:

#!/usr/bin/env python
"""Client specifically for presentations
This client is meant to run on a computer withouth ROS
"""

import kivy
kivy.require('1.8.0')

#import StringIO
from kivy.uix.floatlayout import FloatLayout
from kivy.app import App
from kivy.graphics import Rectangle
from kivy.clock import Clock
from kivy.logger import Logger
from kivy.core.image import Image
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.config import Config
from kivy.cache import Cache
Cache.remove('kv.image')
Cache.remove('kv.texture')
#Config.set('graphics', 'fullscreen', 1)
# screen resolution is 1366x768 for the Asus computer
Config.set('graphics', 'width', '1366')
Config.set('graphics', 'height', '768')

#import pprint
import xml.etree.ElementTree as ET
import base64

# FIXME this shouldn't be necessary
from kivy.base import EventLoop
EventLoop.ensure_window()

STORE_SUBPROCESS = []    # stores roscore and rover program

class ControlClass(FloatLayout):
    """Class grabs data form
    """        
    def __init__(self, **kwargs):
        """
        We use __init__ because some variables cannot be initialized
        to an ObjectProperty for some reason, so we gotta initialize
        it this way
        """
        super(ControlClass, self).__init__(**kwargs)
        self._started = False     # true if client connected
        self.proxy = None
        self.res_x = 1366
        self.res_y = 716

        # normal image widget
        self.norm_im_widget = Widget()
#        self.norm_im_widget.pos = self.pos
#        self.norm_im_widget.size = self.size
        self.add_widget(self.norm_im_widget)

        self.count = 1

        # ++++++++++++Real Time Data+++++++++++++++++++++++
        self.alpr_page = Image('ALPR Page.jpg').texture

        self.alrp_info_coming = False

        self.background_size = (2880, 1800)

        # initialize connection to robot
        self.show_alpr_image()
        self.schedule_alpr_display()

    def get_image_size(self, size, height):
        """Outputs correct image size on screen
        Assume all images are 2880 x 1800 for now
        """
        home_size = size #(2880, 1800)
        # calculate new image size
        aspect_ratio = float(home_size[1]) / float(home_size[0])
        h = height    # self.height
        w = float(h) / float(aspect_ratio)  # desired height
        size = (w, h)
        position = (self.center_x - w/2, self.center_y - h/2)
        return (position, size)

    def show_alpr_image(self):
        """Display the normal image comming straight from the alpr
        """
        # convert data to store in .jpg file
        try:
            im_res = (437, 77)    # image original resolution
            plate_size = self.get_image_size(im_res, 65 )
            im_res = (352, 240)
            car_size = self.get_image_size(im_res, 300 )
#            # image's origin starts from buttom left
            x_shift = self.res_x - self.res_x*.4
            y_shift = self.res_y - self.res_y*0.7905
            (plate_x, plate_y) = (self.center_x + x_shift, 
                                  self.center_y/7 + y_shift - 90)
            (car_x1, car_y1) = (self.center_x + x_shift - 40, 
                                self.center_y/2.5 + y_shift)

            Cache.remove('kv.image')
            Cache.remove('kv.texture')
            self.remove_widget(self.norm_im_widget)
            self.add_widget(self.norm_im_widget)
#            self.norm_im_widget.canvas.clear() 
            if self.count == 1:
                self.count = 0
                print('car')
                with self.norm_im_widget.canvas:     #display image
                    Rectangle(source = 'plate.jpg', pos= (plate_x, plate_y),
                                          size=plate_size[1])
                    Rectangle(source = 'car.jpg', pos= (car_x1, car_y1),
                                          size=car_size[1])
            else:
                print('plate')
                self.count = 1
                with self.norm_im_widget.canvas:     #display image
                    Rectangle(source = 'plate.jpg', pos= (plate_x, plate_y),
                                          size=plate_size[1])
                    Rectangle(source = 'plate.jpg', pos= (car_x1, car_y1),
                                          size=car_size[1])
        except BaseException as e:
            Logger.warning('Error getting image frame %s'%e)
            pass
#            self.stop_connection()

    def get_alpr_data(self, dt):
        # get image data from most recent license plate
        self.show_alpr_image()

    def schedule_alpr_display(self, *args):
        """calls the replay_videos function on loop"""
        Clock.schedule_interval(self.get_alpr_data, 1.0 / 2.0)

    ########## Connect to robot ###############################

    ############################################################

class KivyGui(App):
    try:
        def build(self):
            return ControlClass()
    except BaseException:
        from sys import exit
        exit()

if __name__ == '__main__':
    KivyGui().run()

这是我的kv文件:

#:kivy 1.0
#:import kivy kivy
#:import win kivy.core.window

#:kivy 1.8.0
#
# To load this file, Kivy looks if there is a Kv file with
# the same name as your App class in lowercase, minus
# "App" if it ends with "App". E.g: KivyRobot -> kivy.kv

<ControlClass, FloatLayout>:
    cols: 4
    row: 4
    canvas.before:
        Rectangle:
            # background image
            source: 'ALPR Page.jpg'
            pos: self.pos
            size: self.size

我不确定为什么这不起作用,我不知道还能做什么。

随意使用其他样本图像,因为您没有我拥有的文件。

0 个答案:

没有答案