Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter:更改像素';s颜色_Python_Opencv_Tkinter - Fatal编程技术网

Python Tkinter:更改像素';s颜色

Python Tkinter:更改像素';s颜色,python,opencv,tkinter,Python,Opencv,Tkinter,我在TkInter画布中加载一个图像,允许用户通过鼠标右键单击来绘制一个点。保存鼠标按钮所在像素的坐标后,我使用OpenCV将相关像素更改为红色 没有错误发生,但是对图片没有影响。我的意思是,我没有预期的结果 也许有人能告诉我怎么了 import PIL.Image import Image import ImageTk from Tkinter import * import numpy as np import cv2 class ExampleApp(Frame):

我在TkInter画布中加载一个图像,允许用户通过鼠标右键单击来绘制一个点。保存鼠标按钮所在像素的坐标后,我使用OpenCV将相关像素更改为红色

没有错误发生,但是对图片没有影响。我的意思是,我没有预期的结果

也许有人能告诉我怎么了

import PIL.Image
import Image
import ImageTk
from Tkinter import *    
import numpy as np
import cv2    

class ExampleApp(Frame):
   def __init__(self,master):
        Frame.__init__(self,master=None)
        self.x = self.y = 0
        self.imcv=None
        self.canvas=None   

   def dessiner(self):
       # Load the imge and allow user to scroll it if it is large.
       self.canvas=Canvas(self,cursor="cross",width=600,height=600)
       self.canvas.bind("<ButtonPress-1>",self.on_button_press)
       self.sbarv=Scrollbar(self,orient=VERTICAL)
       self.sbarh=Scrollbar(self,orient=HORIZONTAL)
       self.sbarv.config(command=self.canvas.yview)
       self.sbarh.config(command=self.canvas.xview)

       self.canvas.config(yscrollcommand=self.sbarv.set)
       self.canvas.config(xscrollcommand=self.sbarh.set)

       self.canvas.grid(row=0,column=0,sticky=N+S+E+W)
       self.sbarv.grid(row=0,column=1,stick=N+S)
       self.sbarh.grid(row=1,column=0,sticky=E+W)
       self.im = PIL.Image.open("image.jpg")
       self.widt,self.heigt=self.im.size
       self.canvas.config(scrollregion=(0,0,self.widt,self.heigt))
       self.tk_im = ImageTk.PhotoImage(self.im)
       self.canvas.create_image(0,0,anchor="nw",image=self.tk_im)   


   def on_button_press(self,event):
       self.lecanvas=event.widget
       self.x=self.lecanvas.canvasx(event.x)
       self.y=self.lecanvas.canvasy(event.y)
       self.canvas.create_oval(self.x,self.y, self.x+1,self.y+1,outline='red')
       print self.x,self.y


   def resumer(self):
       self.imcv=cv2.imread("image.jpg")
       self.imcv[self.x,self.y,0]=0
       self.imcv[self.x,self.y,1]=0
       self.imcv[self.x,self.y,2]=255
       cv2.imwrite("result.jpg",self.imcv)
       cv2.namedWindow("gl",cv2.WINDOW_NORMAL)
       cv2.imshow("gl",self.imcv)
       cv2.waitKey(0)
       cv2.destroyAllWindows()






if __name__ == "__main__":
    root=Tk()
    app = ExampleApp(root)
    app.dessiner()
    app.resumer()    
    app.pack()
    root.mainloop()
现在调用的顺序是:

if __name__ == "__main__":
    root=Tk()
    app = ExampleApp(root)
    app.pack()
    app.dessiner()
    root.mainloop()
    app.afficher_pixel()
    app.resumer() 
谢谢你的帮助
提前谢谢。

您需要更改图像的内存副本(
self.tk\u im
)。

您提到了两个问题,一个是关于更改图像,另一个是关于Tkinter窗口前显示的cv2窗口

第二项很简单,因此我将首先解决它。这是因为在调用
app.resumer()
(显示cv2窗口)之后调用了
root.mainloop()
。您可以通过执行
app.resumer()
响应某个事件(比如单击添加的新按钮)或更简单地将对它的调用移动到root.mainloop()返回后进行修复(默认情况下Tkinter窗口关闭时会发生这种情况)


在OpenCV窗口中将像素更改为红色的另一个问题可能与从Tkinter
事件中获取的
self.x
self.y
图像坐标不正确有关,因此,我会检查它们,确保您获得了正确的值并正确使用它们-例如,您是否按正确的顺序使用它们?

在更改后尝试使用
canvas.update()
。可能是代码正常工作,但屏幕上没有显示更改。

谢谢您的帮助,但删除
image=self.tk\u im后的结果相同。在打开Tkinter窗口之前,我还将显示cv2窗口displayed@nakkini当前位置我没有建议将其删除。您需要更新其中的像素。您在屏幕上看到的内容并不反映文件中的更改。您需要重新加载文件,或者直接设置图像对象中的像素。事实上,我有该像素的坐标,但我想使用OpenCV将其颜色更改为红色。它不会改变。我不知道为什么。cv2窗口显示在Tkinter窗口之前,因为您在进入
root.mainloop()
之前执行了
resumer()
方法。相反,您应该执行
resumer()
以响应事件,或者在
root.mainloop()
返回后执行(这发生在Tkinter窗口关闭之后)。@martineau谢谢您,先生,我更改了您提到的执行顺序,但是我得到了一个空白的Tkinter窗口:(只是移动了
app.resumer()
root.mainloop()之后调用
不会这样做。另外,如果您想更改图像的内存副本,请参见。@martineau我有一个空白的TkInter窗口,因为我删除了选项
image=self.tk_im
,现在我把它放回原处,我得到了显示图像的窗口,我按下鼠标右键并绘制了一个像素(点)在图像上。但是像素的颜色值没有改变。出于某种原因,它不会生效。在这种情况下,我将验证从Tkinter事件获得的
self.x
self.y
坐标是否正确。
if __name__ == "__main__":
    root=Tk()
    app = ExampleApp(root)
    app.pack()
    app.dessiner()
    root.mainloop()
    app.afficher_pixel()
    app.resumer()