首页 > 解决方案 > Kivy - 获取图像 ROI 坐标

问题描述

我正在开发一个应用程序,我想在其中加载图像并选择区域的 ROI。选择时,会显示开始和结束坐标。使用小部件,我可以获得 Kivy 应用程序的选择坐标(鼠标向下和鼠标向上)。但是,我真正需要的是图像的确切坐标。有什么方法可以获得图像的投资回报率?

import kivy
kivy.require("1.11.1")

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics.texture import Texture
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.uix.label import Label

from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import *

class TouchInput(Widget):
    def __init__(self, **kwargs):
        super(TouchInput, self).__init__(**kwargs)
        self.start_pos = [0, 0]
        self.end_pos = [0, 0]
        self.img_path = 'img.jpg'

    def but_press(self):
        print("But is pressed!")

    def on_touch_down(self, touch):
        with self.canvas:
            self.canvas.clear()
            # Load Image
            self.img = Image(source=self.img_path)
            self.img.allow_stretch = True
            self.img.keep_ratio = True
            self.img.size = self.size

            # Position set
            self.img.pos = (0, 0)
            self.img.opacity = 1


            self.start_pos = [touch.x, touch.y]
            print("Start pos:", self.start_pos)

    def on_touch_move(self, touch):
        rect_size = [10, 10]
        with self.canvas:
            self.canvas.clear()
            # Load Image
            self.img = Image(source=self.img_path)
            self.img.allow_stretch = True
            self.img.keep_ratio = True
            self.img.size = self.size
            # Position set
            self.img.pos = (0, 0)
            self.img.opacity = 1
            self.end_pos = [touch.x, touch.y]
            # print("End pos  :", self.end_pos)

            if self.start_pos == self.end_pos:
                print("Same position")

            elif (self.start_pos[0] < self.end_pos[0]) and (self.start_pos[1] < self.end_pos[1]):
                print("Top Right")
                rect_start_point = self.start_pos
                rect_size = [abs(self.start_pos[0] - self.end_pos[0]), abs(self.start_pos[1] - self.end_pos[1])]

                print("Pos:", self.start_pos, "Size:", rect_size)
                Color(rgba=(100 / 255, 143 / 255, 165 / 255, 0.6))
                self.rect = Rectangle(pos=rect_start_point, size=(rect_size))

            elif (self.start_pos[0] < self.end_pos[0]) and (self.start_pos[1] > self.end_pos[1]):
                print("Bottom Right")
                rect_start_point = [self.start_pos[0], self.end_pos[1]]
                rect_size = [abs(self.start_pos[0] - self.end_pos[0]), abs(self.start_pos[1] - self.end_pos[1])]

                print("Pos:", self.start_pos, "Size:", rect_size)
                Color(rgba=(23 / 255, 143 / 255, 54 / 255, 0.6))
                self.rect = Rectangle(pos=rect_start_point, size=(rect_size))

            elif (self.start_pos[0] > self.end_pos[0]) and (self.start_pos[1] < self.end_pos[1]):
                print("Top Left")
                rect_start_point = [self.end_pos[0], self.start_pos[1]]
                rect_size = [abs(self.start_pos[0] - self.end_pos[0]), abs(self.start_pos[1] - self.end_pos[1])]

                print("Pos:", self.start_pos, "Size:", rect_size)
                Color(rgba=(100 / 255, 93 / 255, 65 / 255, 0.6))
                self.rect = Rectangle(pos=rect_start_point, size=(rect_size))

            elif (self.start_pos[0] > self.end_pos[0]) and (self.start_pos[1] > self.end_pos[1]):
                print("Bottom Left")
                rect_start_point = self.end_pos
                rect_size = [abs(self.start_pos[0] - self.end_pos[0]), abs(self.start_pos[1] - self.end_pos[1])]

                print("Pos:", self.start_pos, "Size:", rect_size)
                Color(rgba=(100 / 255, 45 / 255, 34 / 255, 0.6))
                self.rect = Rectangle(pos=rect_start_point, size=(rect_size))

            else:
                print("Same Axis")


    def on_touch_up(self, touch):
        rect_size = [10, 10]
        with self.canvas:
            self.canvas.clear()
            # Load Image
            self.img = Image(source=self.img_path)
            self.img.allow_stretch = True
            self.img.keep_ratio = True
            self.img.size = self.size
            # Position set
            self.img.pos = (0, 0)
            self.img.opacity = 1

            self.end_pos = [touch.x, touch.y]
            print("End pos  :", self.end_pos)

            if self.start_pos == self.end_pos:
                print("Same position")

            elif (self.start_pos[0] < self.end_pos[0]) and (self.start_pos[1] < self.end_pos[1]):
                print("Top Right")
                rect_start_point = self.start_pos
                rect_size = [abs(self.start_pos[0] - self.end_pos[0]), abs(self.start_pos[1] - self.end_pos[1])]

                print("Pos:", self.start_pos, "Size:", rect_size)
                Color(rgba=(100 / 255, 143 / 255, 165 / 255, 0.6))
                self.rect = Rectangle(pos=rect_start_point, size=(rect_size))

            elif (self.start_pos[0] < self.end_pos[0]) and (self.start_pos[1] > self.end_pos[1]):
                print("Bottom Right")
                rect_start_point = [self.start_pos[0], self.end_pos[1]]
                rect_size = [abs(self.start_pos[0] - self.end_pos[0]), abs(self.start_pos[1] - self.end_pos[1])]

                print("Pos:", self.start_pos, "Size:", rect_size)
                Color(rgba=(23 / 255, 143 / 255, 54 / 255, 0.6))
                self.rect = Rectangle(pos=rect_start_point, size=(rect_size))

            elif (self.start_pos[0] > self.end_pos[0]) and (self.start_pos[1] < self.end_pos[1]):
                print("Top Left")
                rect_start_point = [self.end_pos[0], self.start_pos[1]]
                rect_size = [abs(self.start_pos[0] - self.end_pos[0]), abs(self.start_pos[1] - self.end_pos[1])]

                print("Pos:", self.start_pos, "Size:", rect_size)
                Color(rgba=(100 / 255, 93 / 255, 65 / 255, 0.6))
                self.rect = Rectangle(pos=rect_start_point, size=(rect_size))

            elif (self.start_pos[0] > self.end_pos[0]) and (self.start_pos[1] > self.end_pos[1]):
                print("Bottom Left")
                rect_start_point = self.end_pos
                rect_size = [abs(self.start_pos[0]-self.end_pos[0]), abs(self.start_pos[1]-self.end_pos[1])]

                print("Pos:", self.start_pos, "Size:", rect_size)
                Color(rgba=(100 / 255, 45 / 255, 34 / 255, 0.6))
                self.rect = Rectangle(pos=rect_start_point, size=(rect_size))

            else:
                print("Same Axis")

class TouchApp(App):
    def clear_canvas(self,obj):
        self.ROI.canvas.clear()

    def build(self):
        Parent = BoxLayout()
        self.ROI = TouchInput()
        Parent.add_widget(self.ROI)
        but = Button(text="clear", size_hint_x=0.2)
        but.bind(on_release=self.clear_canvas)
        Parent.add_widget(but)
        #self.load_kv("overlay.kv")

        return Parent

if __name__ == "__main__":
    TouchApp().run()

提前致谢!

标签: pythonimage-processingkivykivy-language

解决方案


推荐阅读