tkinter und opencv

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

Freitag 23. Dezember 2011, 13:37

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: 5925
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 23. Dezember 2011, 14:45

Ö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: 575
Registriert: Dienstag 13. Februar 2007, 21:57

Freitag 23. Dezember 2011, 14:55

Hallo snafu !

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

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

Montag 26. Dezember 2011, 11:13

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: 575
Registriert: Dienstag 13. Februar 2007, 21:57

Montag 26. Dezember 2011, 23:09

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: 575
Registriert: Dienstag 13. Februar 2007, 21:57

Mittwoch 15. August 2012, 18:25

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