我正在尝试在用户单击的图像上绘制文本。 出现此错误:
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()
答案 0 :(得分:0)
您的img
是ImageTK
中的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