无法在图像的mouseclick区域上写文本

时间:2019-04-06 11:54:05

标签: python tkinter cv2

我正在尝试在用户单击的图像上绘制文本。 出现此错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/Admin/PycharmProjects/ashish/td.py", line 35, in draw_text
    cv2.putText(img, "OpenCV + Jurassic Park!!!", (event.x,event.y), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
TypeError: Expected cv::UMat for argument 'img'
if __name__ == "__main__":
    root = Tk()
    frame = Frame(root, bd=2, relief=SUNKEN)
    canvas = Canvas(frame, bd=0)
    canvas.grid(row=0, column=0, sticky=N+S+E+W)
    frame.pack(fill=BOTH,expand=1)

    #adding the image
    File = filedialog.askopenfilename(parent=root, initialdir="F:/",title='Choose an image.')
    img = ImageTk.PhotoImage(Image.open(File))
    canvas.create_image(0,0,image=img,anchor="nw")

    #function to be called when mouse is clicked
    def draw_text(event):
        cv2.putText(img, "OpenCV + Jurassic Park!!!", (event.x,event.y), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
        cv2.imshow("Text", img)
    #mouseclick event
    canvas.bind("<Button 1>",draw_text)

    root.mainloop()

1 个答案:

答案 0 :(得分:0)

您的imgImageTK中的tkinter对象,但是cv2不是tkinter的一部分,并且cv2.putText不适用于{{ 1}}。它需要一些不同的东西。 ImageTK具有读取图像的功能,它创建可以与cv2一起使用的对象。

但是cv2.putText()具有在图像顶部显示文本的功能,您不需要canvas。但是无法将其另存为带有文本的图像。

但是cv2具有在图像上绘制文本的功能,可以将其保存在文件中。

因此,最终您不需要Image


我使用cv2创建对象,可以在上面放置文本或绘制线条/正方形/等。
添加文本后,我替换了画布上的图像。

此方法使用可以保存在文件(Image.Draw)中的文本创建图像

img.save()

使用from tkinter import * from tkinter import filedialog from PIL import Image, ImageTk, ImageDraw # function to be called when mouse is clicked def draw_text(event): global imgtk global cv_img # create object for drawing draw = ImageDraw.Draw(img) # put text draw.text((event.x,event.y), "ImageDraw + Jurassic Park!!!") # replace old image canvas.delete(cv_img_id) imgtk = ImageTk.PhotoImage(img) cv_img_id = canvas.create_image(0, 0, image=imgtk, anchor="nw") if __name__ == "__main__": root = Tk() frame = Frame(root, bd=2, relief=SUNKEN) frame.pack(fill=BOTH, expand=1) canvas = Canvas(frame, bd=0) canvas.grid(row=0, column=0, sticky=N+S+E+W) #adding the image file = filedialog.askopenfilename(parent=root, initialdir="F:/",title='Choose an image.') img = Image.open(file) imgtk = ImageTk.PhotoImage(img) cv_img_id = canvas.create_image(0, 0, image=imgtk, anchor="nw") #mouseclick event canvas.bind("<Button 1>", draw_text) root.mainloop() 可以在图像上方放置文本,以便以后移动/删除,但是不会创建带有可以保存在文件中的文本的图像。

canvas.create_text