如何在打包的Tkinter画布上使用相机(opencv)

时间:2013-06-12 14:11:06

标签: python opencv canvas camera tkinter

有人可以解释一下,为什么在注释掉代码后,没有更多的摄像头视图? 我收到错误消息

  

“self.a = Image.fromarray(self.capture)#PIL 1.6#   AttributeError:class Image没有属性'fromarray'“

来自x.update_video方法。 评论的代码来自主题OpenCV (cv2 in Python) VideoCapture not releasing camera after deletion 我对Tkinter很新,在教程中没有找到任何帮助。 我想这是由于框架和画布一样。但必须有任何解决方案......

class App:
      def __init__(self, master,cam):
##    root = tk.Tk()
##    videoframe = tk.LabelFrame(root,text='Captured video')
##    videoframe.grid(column=0,row=0,columnspan=1,rowspan=1,padx=5, pady=5, ipadx=5, ipady=5)
##    canvas = tk.Canvas(videoframe, width=640,height=480)
##    canvas.grid(column=0,row=0)
##    cam = cv2.VideoCapture(2)
##    x = vid(cam,root,canvas)
##    root.after(0,x.update_video)
##    button = tk.Button(text='Quit',master=videoframe,command=root.destroy)
##    button.grid(column=0,row=1)
##    root.mainloop()
##    del cam
        frame = LabelFrame(master,text='Captured video')
        frame.pack()
        canvas = Canvas(frame, width=640,height=480)
        canvas.pack(side=TOP)

        x = vid(cam,master,canvas)
        master.after(0,x.update_video)

        self.button = Button(frame, text="QUIT", fg="red", command=master.destroy)
        self.button.pack(side=LEFT)
        self.hi_there = Button(frame, text="Hello", command=self.say_hi)
        self.hi_there.pack(side=LEFT)
      def say_hi(self):
        print "hi there, everyone!"
root = Tk()
cam = cv2.VideoCapture(0)
app = App(root,cam)
root.mainloop()
del cam

3 个答案:

答案 0 :(得分:1)

错误消息正在准确地告诉您问题所在:您尝试在没有此类方法的类上调用fromarray。这可能意味着Image不是您认为的那样,所以首先要确切地验证Image是什么,以及是否应该使用fromarray方法。

答案 1 :(得分:0)

我的图像是从相机捕获的。

 def update_video(self):
        (self.readsuccessful,self.f) = self.cam.read()
        self.capture = cv2.cvtColor(self.f, cv2.COLOR_RGB2RGBA) #cv2.COLOR_RGB2GRAY)
        self.a = Image.fromarray(self.capture)#nowe w PIL 1.6 #PIL.Image.VERSION=1.1.7
        self.b = ImageTk.PhotoImage(image=self.a) ...

它适用于评论版。虽然Image类有fromarray方法,但还没有很好的文档化。

答案 2 :(得分:0)

Brayan的回答让我感到有些困惑,但我们是对的。我的问题是由include引起的。 永远不要使用import *。它用来自Tkinter的Image类从PIL模块覆盖了Image类,这个类没有这样的方法。感谢。