尝试了不同的可能性后,最终要发布:
该程序将向用户显示图像。用户将使用鼠标单击来单击图像的不同区域。每次单击鼠标都会在list_of_points列表中收集点。右键单击,我想从list_of_points列表中生成一个多边形。多边形库必须为
PIL.ImageDraw.Draw.polygon(xy,fill = None,outline = None)
我反复遇到以下错误:
TypeError:函数正好接受2个参数(给定1个参数)
和此错误:
self.draw.draw_polygon(xy,墨水,0) SystemError:新样式的getargs格式,但参数不是元组
下面是代码:
from Tkinter import *
import Image, ImageTk, ImageDraw
import numpy as np
coord=[] # for saving coord of each click position
Dict_Polygon={} # Dictionary for saving polygon
list_of_points=[]
flag=True
label=0
# Input image
img = Image.open("test.jpg")
draw = ImageDraw.Draw(img)
def draw_lines(event):
mouse_xy = (event.x, event.y)
func_Draw_lines(mouse_xy)
def func_Draw_lines(mouse_xy):
center_x, center_y = mouse_xy
if canvas.old_coords:
x1, y1 = canvas.old_coords
canvas.create_line(center_x, center_y, x1, y1)
# add clicked positions to list
if flag==True:
list_of_points.append(mouse_xy)
canvas.old_coords = center_x, center_y
def draw_poly(event):
numberofPoint=len(list_of_points)
if numberofPoint>2:
#draw =ImageDraw.Draw(img)
poly=zip(list_of_points)
print(poly)
draw.polygon(poly, fill=None, outline=(255, 0, 0))
# label= canvas.create_polygon(list_of_points, fill='', outline='green', width=2)
canvas.old_coords=None
list_of_points[:]=[]
# Main function
if __name__ == '__main__':
root = Tk()
# Draw canvas for iput image to pop up image for clicks
filename = ImageTk.PhotoImage(img)
canvas = Canvas(root,height=img.size[0],width=img.size[0])
canvas.image = filename
canvas.create_image(0,0,anchor='nw',image=filename)
canvas.pack()
canvas.old_coords = None
# bind function to canvas to generate event
canvas.bind("<Button 3>", draw_lines)
canvas.bind("<Button 1>", draw_poly)
root.mainloop()
`
答案 0 :(得分:3)
您需要类似-
的格式[(411, 113), (158, 169), (344, 364)]
但是您正在传递元组的元组-
((411, 113),), ((158, 169),), ((344, 364),)]
尝试这种结构-
[(432, 224), (196, 245), (268, 379)]
或者直接列表也可以-
[432, 224, 196, 245, 268, 379]
查看文档here
元组的元组在需要两个参数时成为该函数的一个参数。您不需要zip(poly)
,只需传递numberofPoint
就可以。让我知道是否有帮助
答案 1 :(得分:0)
当我直接将list_of_points
传递给draw.polygon
时,它可以正常工作,因此不需要任何转换。
但是,多边形是在PIL图像上绘制的,而不是在画布上显示的PhotoImage上绘制的。因此,要查看多边形,您需要更新PhotoImage。到达d的方法是使用.paste
的{{1}}方法。
这是ImageTk.PhotoImage
函数,具有以下更改:
draw_poly