- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个带有道路图像的程序,允许用户在 Canvas 上修建道路。目前,用户可以选择道路通向何处,并且不必连接到另一条道路。这是一个例子:(道路图像由用户放置)
我想要发生的是,一旦按下构建道路(垂直)
或构建道路(水平)
,它将检测该道路的任何现有图像,然后根据按下的按钮将其垂直或水平放置。我知道这听起来有点牵强,但这是我的代码:
from tkinter import *
root = Tk()
root.title("root")
road1 = PhotoImage(file=r"road1.png")
road2 = PhotoImage(file=r"road2.png")
road3 = PhotoImage(file=r"intersection.png")
canvas = Canvas(root, width=500, height=400, bg='green')
button_frame = Frame(root)
button_frame.pack(side="left", fill="y")
canvas.pack(side="right", fill="both", expand=True)
roadstart = canvas.create_image(100, 0, image=road1)
clickedv = None
clickedh = None
clickedm = None
def buildroadv():
global clicked
clickedv = False
road = canvas.create_image(50, 50, image=road1)
def move(event):
global clickedv
if clickedv == False:
x = event.x
y = event.y
canvas.coords(road, x, y)
def placeroad(event):
global clickedv
clickedv = True
canvas.tag_bind(road, "<Motion>", move)
canvas.tag_bind(road, "<ButtonPress-1>", placeroad)
def buildroadh():
global clickedh
clickedh = False
road = canvas.create_image(50, 50, image=road2)
def move(event):
global clickedh
if clickedh == False:
x = event.x
y = event.y
canvas.coords(road, x, y)
def placeroad(event):
global clickedh
clickedh = True
canvas.tag_bind(road, "<Motion>", move)
canvas.tag_bind(road, "<ButtonPress-1>", placeroad)
def buildroadm():
global clickedm
clickedm = False
road = canvas.create_image(50, 50, image=road3)
def move(event):
global clickedm
if clickedm == False:
x = event.x
y = event.y
canvas.coords(road, x, y)
def placeroad(event):
global clickedm
clickedm = True
canvas.tag_bind(road, "<Motion>", move)
canvas.tag_bind(road, "<ButtonPress-1>", placeroad)
button1 = Button(button_frame, text="Build Road (vertical)", command=buildroadv)
button2 = Button(button_frame, text="Build Road (horizontal)", command=buildroadh)
button3 = Button(button_frame, text="Build Road (intersection)", command=buildroadm)
button4 = Button(button_frame, text="Build -")
button5 = Button(button_frame, text="Build -")
button6 = Button(button_frame, text="Build -")
button7 = Button(button_frame, text="Build -")
button8 = Button(button_frame, text="Build -")
button1.pack(side="top", fill="x")
button2.pack(side="top", fill="x")
button3.pack(side="top", fill="x")
button4.pack(side="top", fill="x")
button5.pack(side="top", fill="x")
button6.pack(side="top", fill="x")
button7.pack(side="top", fill="x")
button8.pack(side="top", fill="x")
为了再次概述我的目标,我希望程序能够检测是否已有道路
,如果存在,则相应地放置新道路。例如:
我希望这已经足够解释了。对于这样一个具体的问题/广泛的答案,我深表歉意。
最佳答案
好吧,这对于你正在做的事情来说可能是疯狂的矫枉过正。您可能只需使用上次单击的坐标来提取道路的尺寸和位置。不幸的是,如果无法访问图像,我无法对此进行测试,所以我想我应该为您提供一种更通用的解决方案,即使您将像您提供的图像这样的图像加载到 Canvas 上(没有点击),该解决方案也能工作。记住。此外,正如一些评论所指出的,如果您已经知道路障的坐标和尺寸,那么放置它们就很简单了。只需根据您保存的值将新道路设置在适当的位置即可。当您不知道道路在哪里时,即当您查看原始图像时,事情会变得有点困难。这就是我要研究的问题。我采取的基本策略是像对待任何其他图像处理/计算机视觉问题一样对待这个问题,并将道路视为图像中的对象。
第一步是隔离道路。为此,您可以使用索贝尔过滤器来查找边缘,然后进行阈值处理和填充,将它们变成实心 block :
import imageio
import skimage
import numpy
import scipy.ndimage.filters
import skimage.io
import skimage.filters
import skimage.morphology
image = imageio.imread(r'C:\Users\Jeremiah\Pictures\roads.PNG')
image_array = numpy.float64(image)
#Sobel Filter for color image. First the kernel is applied to the RGB values, then some linear algebra is done to marry the results together and apply them to the image as a whole.
R_x = scipy.ndimage.filters.correlate(image_array[:, :, 0], [[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
G_x = scipy.ndimage.filters.correlate(image_array[:, :, 1], [[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
B_x = scipy.ndimage.filters.correlate(image_array[:, :, 2], [[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
R_y = scipy.ndimage.filters.correlate(image_array[:, :, 0], [[1, 0 , -1], [2, 0, -2], [1, 0, -1]])
G_y = scipy.ndimage.filters.correlate(image_array[:, :, 1], [[1, 0 , -1], [2, 0, -2], [1, 0, -1]])
B_y = scipy.ndimage.filters.correlate(image_array[:, :, 2], [[1, 0 , -1], [2, 0, -2], [1, 0, -1]])
Jacobian_x = R_x**2 + G_x**2 + B_x**2
Jacobian_y = R_y**2 + G_y**2 + B_y**2
Jacobian_xy = R_x * R_y + G_x * G_y + B_x * B_y
Determinant = numpy.sqrt(numpy.fabs((Jacobian_x**2) - (2 * Jacobian_x * Jacobian_y) + (Jacobian_y**2) + 4 * (Jacobian_xy**2)))
Maximum_Eigenvalue = (Jacobian_x + Jacobian_y + Determinant) / 2
Edges = numpy.sqrt(Maximum_Eigenvalue)
#A threshold is set, and a binary image is produced that sets everything above the threshold to 255 and everything below it to 0.
Threshold = skimage.filters.threshold_mean(Edges)
Binary_Image = Edges > Threshold
#The holes in the objects are filled in, so that each road is a solid block.
Filled_Holes = scipy.ndimage.morphology.binary_fill_holes(Binary_Image)
接下来,标记你的 block :
labeled_Edges, features = scipy.ndimage.label(Filled_Holes)
现在您已经标记了图像中的对象,您可以使用 labeled_Edges
切片作为该 block 开始和停止位置的索引。 features
为您提供图像中对象的数量。举个例子:
sliced = scipy.ndimage.find_objects(labeled_Edges)[3]
>>>(slice(127, 166, None), slice(37, 71, None))
如果我们使用该切片作为原始图像数组中的索引,我们会得到一个仅包含该对象的像素的数组,为方便起见进行了标记:
slices = labeled_Edges[sliced]
>>>[[4 4 4 ... 4 4 4]
[4 4 4 ... 4 4 4]
[4 4 4 ... 4 4 4]
...
[4 4 4 ... 4 4 4]
[4 4 4 ... 4 4 4]
[4 4 4 ... 4 4 4]]
4
仅表示这是图像中的第四个标记对象,因为我们在本例中搜索了 labeled_Edges[3]
。在实践中,您可能希望使用 for
循环自动执行此操作,范围设置为 1 到 features
,但是一旦您有了切片,您就拥有了索引任何道路图 block 的开始和结束,您只需将下一个道路图 block 的边缘放置在下一个像素上。因此,在上面的示例中,我们的角点位于 (127, 37)、(127, 71)、(166, 37) 和 (166,71)
。只需使用这些拐角即可自动放置下一条道路。例如,如果您想在该路段的右侧放置一个路 block ,并且您正在使用左上角引用要放置的路 block ,则新道路将放置在 (166, 37)
。要将相同的 block 放置在该 block 的左侧,并使用相同的角作为 anchor ,您可以将其放置在 (127 - new_block_length, 37)
处。
不幸的是,您的问题的某些方面相当不具体。您是否将道路图像的位置存储在任何地方,或者您是否需要让程序实际查看图像?您是否希望在点击“水平”时放置所有可能的水平道路,或者是否有一种方法来引用特定道路?您是使用中心像素还是角点之一来放置道路?有很多变量阻止您为该解决方案编写代码,但这可能会给您一些尝试的想法,并且至少让您了解如何本地化图像本身中的对象。
这个答案有点宽泛,但问题也有点宽泛。如果您已经存储了道路位置,则不需要计算机视觉的任何东西。您只需使用简单的变量调用找到道路的坐标并执行相同的操作,根据最后一条道路的位置放置新道路。
关于python - 如何获取 Canvas 图像来检测并传送到另一个 Canvas 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53750598/
这是一个与 Get OS-Version in WinRT Metro App C# 相关的问题但不是它的重复项。 是否有任何选项可以从 Metro 应用程序检测系统上是否有可用的桌面功能?据我所知,
我想在闹钟响起时做点什么。例如, toast 或设置新闹钟。我正在寻找可以检测闹钟何时响起的东西。首先,我在寻找广播 Action ,但找不到。也许是我的错? 当闹钟响起时,还有其他方法可以做些什么吗
如果某个 JS 添加了一个突变观察者,其他 JS 是否有可能检测、删除、替换或更改该观察者?我担心的是,如果某些 JS 旨在破坏某些 DOM 元素而不被发现,那么 JS 可能想要摆脱任何观察该 DOM
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
有没有办法在您的 Activity/应用程序中(以编程方式)知道用户已通过 USB 将您的手机连接到 PC? 最佳答案 有人建议使用 UMS_CONNECTED自最新版本的 Android 起已弃用
我正在想办法测量速度滚动事件,这将产生某种代表速度的数字(相对于所花费的时间,从滚动点 A 到点 B 的距离)。 我欢迎任何以伪代码形式提出的建议...... 我试图在网上找到有关此问题的信息,但找不
某些 JavaScript 是否可以检测 Skype 是否安装? 我问的原因是我想基于此更改链接的 href:如果未安装 Skype,则显示一个弹出窗口,解释 Skype 是什么以及如何安装它,如果已
我们正在为 OS X 制作一个使用 Quartz Events 移动光标的用户空间设备驱动程序,当游戏(尤其是在窗口模式下运行的游戏)无法正确捕获鼠标指针时,我们遇到了问题(= 将其包含/保留在其窗口
我可以在 Controller 中看到事件 $routeChangeStart,但我不知道如何告诉 Angular 留下来。我需要弹出类似“您要保存、删除还是取消吗?”的信息。如果用户选择取消,则停留
我正在解决一个问题,并且已经花了一些时间。问题陈述:给你一个正整数和负整数的数组。如果索引处的数字 n 为正,则向前移动 n 步。相反,如果为负数(-n),则向后移动 n 步。假设数组的第一个元素向前
我试图建立一个条件,其中 [i] 是 data.length 的值,问题是当有超过 1 个值时一切正常,但当只有 1 个值时,脚本不起作用。 out.href = data[i].hr
这是我的问题,我需要检测图像中的 bolt 和四分之一,我一直在搜索并找到 OpenCV,但据我所知它还没有在 Java 中。你们打算如何解决这个问题? 最佳答案 实际上有一个 OpenCV 的 Ja
是否可以检测 ping? IE。设备 1 ping 设备 2,我想要可以在设备 2 上运行的代码,该代码可以在设备 1 ping 设备时进行检测。 最佳答案 ping 实用程序使用的字面消息(“ICM
我每天多次运行构建脚本。我的感觉是我和我的同事花费了大量时间等待这个脚本执行。现在想知道:我们每天花多少时间等待脚本执行? .我可以对总体平均值感到满意,即使我真的很想拥有每天的数据(例如“上周一我们
我已经完成了对项目的编码,但是当我在客户端中提交了源代码时,就对它进行了测试,然后检测到内存泄漏。我已经在Instruments using Leaks中进行了测试。 我遇到的问题是AVPlayer和
我想我可以用 std.traits.functionAttributes 来做到这一点,但它不支持 static。对于任何类型的可调用对象(包含 opCall 的结构),我如何判断该可调用对象是否使用
我正在使用多核 R 包中的并行和收集函数来并行化简单的矩阵乘法代码。答案是正确的,但并行版本似乎与串行版本花费的时间相同。 我怀疑它仅在一个内核上运行(而不是在我的机器上可用的 8 个内核!)。有没有
我正在尝试在读取 csv 文件时编写一个这样的 if 语句: if row = [] or EOF: do stuff 我在网上搜索过,但找不到任何方法可以做到这一点。帮忙? 最佳答案 wit
我想捕捉一个 onFontSizeChange 事件然后做一些事情(比如重新渲染,因为浏览器已经改变了我的字体大小)。不幸的是,不存在这样的事件,所以我必须找到一种方法来做到这一点。 我见过有人在不可
我有一个使用 Windows 服务的 C# 应用程序,该服务并非始终打开,我希望能够在该服务启动和关闭时发送电子邮件通知。我已经编写了电子邮件脚本,但我似乎无法弄清楚如何检测服务状态更改。 我一直在阅
我是一名优秀的程序员,十分优秀!