python - 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()
提前致谢!
解决方案
推荐阅读
- html - 如何使用 [ngClass] 或 customClass 更改 tabset nav-pills 背景颜色
- html - 如何从 HTML 执行 jar 文件?
- c# - 如何使用 MediaPlayerElement 将 ui 同步到全屏或紧凑模式
- sql-server - SQL Server - 在“async_network_io”状态下查询取消
- ios - Firebase子查询在删除一个键然后添加回来后出现零
- python - 使用 Python Pandas 将(美国)负数转换为 -Europeans
- node.js - 如何从 REACT JS 获取 JSON 以在 NODE js 中实现
- django - 我的两个自定义用户模型不能登录失败
- postgresql - 我不能在 PostgreSQL 中以参数方式从 current_date 中减去天数
- xml - VB.NET Winform:如何通过 XML 翻译对象 Text 属性