tkinter und opencv

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !

habe mal mit Tkinter und opencv gespielt und versucht meine webcam in Tkinter einzubetten.

Code: Alles auswählen

import Tkinter as tk
import opencv
from opencv import highgui
from PIL import ImageTk

TITLE = "Capture Cam"
UPDATE_TIME = 40

class Cam(tk.Label):
    def __init__(self, root):
        tk.Label.__init__(self, root)
        self.root = root
        self.camera = highgui.cvCreateCameraCapture(0)
        
    def run(self):
        self.img = ImageTk.PhotoImage(opencv.adaptors.Ipl2PIL(
            highgui.cvQueryFrame(self.camera)))
        self.config(image = self.img)
        self.root.after(UPDATE_TIME, self.run)

if __name__ == '__main__':
    root = tk.Tk()
    cam = Cam(root)
    cam.pack()
    cam.run()
    root.title(TITLE) 
    root.mainloop()
Gruß Frank
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Öhm, kommt da noch ne Frage oder war das eine Art Proof of Concept? Deine Wortwahl ("versucht") klingt ein bißchen so, als hätte das nicht richtig geklappt...
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo snafu !

Ne, klappt gut - nur könnte es ja sein, dass es nicht stabil ist.

Gruß Frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !
mit verkleinertem Fenster:

Code: Alles auswählen

import Tkinter as tk
import opencv
from opencv import highgui
from PIL import ImageTk

TITLE = "Capture Cam"
UPDATE_TIME = 30
WIDTH = 320
HEIGHT = 240

class Cam(tk.Label):
    def __init__(self, root, width, height):
        tk.Label.__init__(self, root)
        self.width = width
        self.height = height
        self.root = root
        self.camera = highgui.cvCreateCameraCapture(0)
        
    def run(self):
        self.img = ImageTk.PhotoImage(image = opencv.adaptors.Ipl2PIL(
            highgui.cvQueryFrame(self.camera)).resize((self.width, 
            self.height)))
        self.config(image = self.img)
        self.root.after(UPDATE_TIME, self.run)

if __name__ == '__main__':
    root = tk.Tk()
    cam = Cam(root, WIDTH, HEIGHT)
    cam.pack()
    cam.run()
    root.title(TITLE) 
    root.mainloop()
Gruß Frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !

Mit der Möglichkeit Bilder aufzunehmen:

Code: Alles auswählen

import Tkinter as tk
import opencv
from opencv import highgui
from PIL import ImageTk
import time

TITLE = "Capture Cam"
UPDATE_TIME = 30
WIDTH = 320
HEIGHT = 240
TIME_FORMAT = "%m\%d\%Y_%H:%M:%S"
IMAGE_EXT = ".jpeg"
SAVE_IMAGE_TEXT = "cam_"


class Cam(tk.Label):
    def __init__(self, root, width, height):
        tk.Label.__init__(self, root)
        self.width = width
        self.height = height
        self.root = root
        self.camera = highgui.cvCreateCameraCapture(0)
        
    def run(self):
        self.current_image = opencv.adaptors.Ipl2PIL(highgui.cvQueryFrame(
            self.camera)).resize((self.width, self.height))
        self.tk_image = ImageTk.PhotoImage(self.current_image)
        self.config(image = self.tk_image)
        self.root.after(UPDATE_TIME, self.run)
        
    def save_image(self):
        self.current_image.save("%s%s%s" %(SAVE_IMAGE_TEXT, time.strftime(
            TIME_FORMAT), IMAGE_EXT))

if __name__ == '__main__':
    root = tk.Tk()
    cam = Cam(root, WIDTH, HEIGHT)
    cam.pack()
    cam.run()
    tk.Button(root, text = "Save Image", command = cam.save_image).pack()
    root.title(TITLE) 
    root.mainloop()
Gruß Frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo

Die aufgenommenen Fotos werden zu einem Film zusammengesetzt.

Code: Alles auswählen

import Tkinter as tk
from PIL import Image, ImageTk
import cv

UPDATE_TIME = 10
WIDTH = 600
HEIGHT = 480
RGB = "RGB"
BGR = "BGR"
MODUS = "raw"
MOVIE_NAME = "output.avi"
BUTTON_TEXT = "OK"
BUTTON_WIDTH = 10
FPS = 30
CAM = 1

class Cam(tk.Label):
    def __init__(self, root, width, height, cam, movie_file):
        tk.Label.__init__(self, root)
        self.width = width
        self.height = height
        self.root = root
        self.writer = cv.CreateVideoWriter(filename = movie_file, fourcc=
           cv.CV_FOURCC("D","I","V","X"), fps=FPS, frame_size=(width ,
           height))
        self.camera = cv.CaptureFromCAM(cam)
        
    def run(self):
        self.ipl_image = cv.QueryFrame(self.camera)
        self.tk_image = ImageTk.PhotoImage(image = self.resize_image(
            Image.fromstring(RGB, (self.ipl_image.width, 
            self.ipl_image.height), self.ipl_image.tostring(), MODUS, BGR ))) 
        self.config(image = self.tk_image)
        self.root.after(UPDATE_TIME, self.run)
       
    def write_frame(self):
        cv.WriteFrame(self.writer, self.ipl_image)
        
    def resize_image(self, img):
        img_width, img_height = img.size
        if self.height >= self.width:
            div_faktor = (float(str(int(img_width)))
                / float(str(self.width)))
            img_width = img_width / div_faktor
            img_height = img_height / div_faktor
        else:
            div_faktor = (float(str(int(img_height)))
                / float(str(self.height)))
            img_width = img_width / div_faktor
            img_height = img_height / div_faktor
        
        return img.resize((int(img_width), int(img_height)))
        
if __name__ == '__main__':
    root = tk.Tk()
    cam = Cam(root, WIDTH, HEIGHT, CAM, MOVIE_NAME)
    cam.pack()
    def write_image():
       cam.write_frame()
    tk.Button(root, text = BUTTON_TEXT, width = BUTTON_WIDTH,
              command = write_image).pack()
    cam.run()
    root.mainloop()
Gruß Frank
Antworten