Python Tkinter窗口中cv2图像上的鼠标事件

Python Tkinter窗口中cv2图像上的鼠标事件,python,opencv,tkinter,Python,Opencv,Tkinter,我正在开发一个程序,它允许你自由裁剪一幅图像,同时向你展示结果图像。下面的代码实现了这一点 将numpy作为np导入 进口cv2 def裁剪: 全球资源 pts=np.arraypts 掩码=np.zerosheight,width,dtype=np.uint8 cv2.fillPolymask,[pts],255 res=cv2。按位_和img,img,mask=mask rect=cv2.boundingrectps返回rect的x,y,w,h 裁剪=res[rect[1]:rect[1]+

我正在开发一个程序,它允许你自由裁剪一幅图像,同时向你展示结果图像。下面的代码实现了这一点

将numpy作为np导入 进口cv2 def裁剪: 全球资源 pts=np.arraypts 掩码=np.zerosheight,width,dtype=np.uint8 cv2.fillPolymask,[pts],255 res=cv2。按位_和img,img,mask=mask rect=cv2.boundingrectps返回rect的x,y,w,h 裁剪=res[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]] cv2.imshow'res',res def mouse_callbackevent,x,y,标志,参数: 全球选择、pts、img 如果event==cv2.event\u LBUTTONDOWN: 选择=真 elif event==cv2.event\u MOUSEMOVE: 如果选择==True: 附页,y 作物 printx,y elif event==cv2.event\u LBUTTONUP: 选择=假 res=无 选择=假 pts=[] img=cv2.imreadgirl.png,-1 高度=img.形状[0] 宽度=img.形状[1] cv2.命名为“图像” cv2.setMouseCallback'image',鼠标回调 cv2.imshow‘image’,img cv2.0 cv2.imwriteres.png,res 我的挑战是将上述代码封装到一个接口中,如下所示:

到目前为止,我已经按照教程实现了类似的功能:

导入必要的包 从tkinter进口* 从PIL导入图像 从PIL导入ImageTk 从tkinter导入文件对话框作为tkf 进口cv2 def select_图像: 抓取图像面板的引用 全球专题小组A、专题小组B 打开文件选择器对话框,允许用户选择输入 形象 path=tkf.askopenfilename 确保选择了文件路径 如果lenpath>0: 从磁盘加载图像,将其转换为灰度,然后检测 边缘 image=cv2.imreadpath 灰色=cv2.CVT彩色图像,cv2.COLOR\U BGR2GRAY 边缘=cv2。套管,50,100 OpenCV以BGR顺序表示图像;然而,PIL代表 图像以RGB顺序排列,因此我们需要交换通道 图像=cv2.CVT彩色图像,cv2.COLOR\u BGR2RGB 将图像转换为PIL格式。。。 image=image.fromarrayimage 边=Image.fromArrayEdge …然后转换为ImageTk格式 image=ImageTk.PhotoImageimage 边缘=图像tk.photoImageEdge 如果面板为“无”,则对其进行初始化 如果panelA为无或panelB为无: 第一个面板将存储我们的原始图像 面板A=标签图像=图像 panelA.image=image panelA.packside=left,padx=10,pady=10 而第二个面板将存储边缘贴图 面板B=标签图像=边缘 panelB.image=边缘 面板B.填料侧=右侧,padx=10,pady=10 否则,请更新图像面板 其他: 更新窗格 panelA.configureimage=image panelB.configureimage=边缘 panelA.image=image panelB.image=边缘 初始化窗口工具包以及两个图像面板 根=Tk panelA=无 b=无 创建一个按钮,然后按下时,将触发文件选择器 对话框,允许用户选择输入图像;然后添加 按钮打开GUI btn=按钮root,text=选择图像,command=选择图像 btn.packside=bottom,fill=bottom,expand=yes,padx=10,pady=10 启动GUI root.mainloop
我没有做到的是在tkinter中实现鼠标事件,因为该函数接受一个窗口名——但我只希望它应用于图像。如何实现这一点?

与其将命令绑定到图像,不如将其绑定到包含图像的tk.标签:

import tkinter as tk
from PIL import Image
from PIL import ImageTk

root = tk.Tk()
ima = Image.open('test.png')
imag = ImageTk.PhotoImage(ima)
lab = tk.Label(root, image=imag)
lab.pack()
lab.bind('<Button-1>', *function)
root.mainloop()
解释

Tkinter提供了一个强大的机制,让您能够处理事件 你自己对于每个小部件,可以绑定Python函数和方法 与事件相关

事件以字符串形式给出,使用特殊事件:


与其将命令绑定到图像,不如将其绑定到包含图像的tk.标签:

import tkinter as tk
from PIL import Image
from PIL import ImageTk

root = tk.Tk()
ima = Image.open('test.png')
imag = ImageTk.PhotoImage(ima)
lab = tk.Label(root, image=imag)
lab.pack()
lab.bind('<Button-1>', *function)
root.mainloop()
解释

Tkinter提供了一个强大的机制,让您能够处理事件 你自己对于每个小部件,可以绑定Python函数和方法 与事件相关

事件以字符串形式给出,使用特殊事件: