Ejemplo n.º 1
0
    def __init__(self, source):

        # api
        self.api = cv.CAP_ANY

        # source
        self.source = source
        self.iscam = False
        if source.isdigit():
            self.source = int(source)
            self.iscam = True
            if sys.platform == 'win32':
                # adapt api on windows
                self.api = cv.CAP_DSHOW

        self.preview = WindowManager('preview', self.onKeypress)
        self.capture = CaptureManager(cv.VideoCapture(self.source, self.api),
                                      self.preview)

        self.capture.width = 640
        self.capture.height = 480
        self.h_mirror = False
        self.v_mirror = False

        if self.capture.fpsAnnounced > 0:
            self.preview.waitKeyDelay = int(1000.0 / self.capture.fpsAnnounced)
Ejemplo n.º 2
0
    def __init__(self):

        self.root = root = tk.Tk()
        root.title("Webcam capture")

        self.vidcap = cv.VideoCapture(0, cv.CAP_DSHOW)
        self.capman = CaptureManager(self.vidcap)
        self.capcfg = CameraSettings(self.vidcap)

        self.filter = None

        body = tk.Frame(root)
        self.initial_focus = self.body(body)
        body.pack(padx=5, pady=5)

        root.grab_set()

        if not self.initial_focus:
            self.initial_focus = root

        root.protocol('WM_DELETE_WINDOW', self.cancel)
        self.initial_focus.focus_set()

        self.video_loop()
        self.refresh_stats()
Ejemplo n.º 3
0
 def __init__(self, source=0):
     if isinstance(source, int):
         camera = cv.VideoCapture(source, cv.CAP_DSHOW)
     else:
         camera = cv.VideoCapture(source)
     self.win = WindowManager('Cameo', self.onKeypress)
     self.capture = CaptureManager(camera=camera,
                                   previewWindowManager=self.win,
                                   shouldMirrorPreview=False)
     self.capture.width = 800
     self.capture.height = 448
     self._filter = None
     self._display = True
Ejemplo n.º 4
0
class Application:
    def __init__(self):

        self.root = root = tk.Tk()
        root.title("Webcam capture")

        self.vidcap = cv.VideoCapture(0, cv.CAP_DSHOW)
        self.capman = CaptureManager(self.vidcap)

        body = tk.Frame(root)
        self.initial_focus = self.body(body)
        body.pack(padx=5, pady=5)

        root.grab_set()

        if not self.initial_focus:
            self.initial_focus = root

        root.protocol('WM_DELETE_WINDOW', self.cancel)
        self.initial_focus.focus_set()

        self.video_loop()

    def body(self, master):
        self.panel = tk.Label(master)
        self.panel.pack(padx=10, pady=10)

        btn = tk.Button(master, text="Snapshot !", command=self.take_snapshot)
        btn.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        btn = tk.Button(master,
                        text="Camera Settings",
                        command=self.open_settings)
        btn.pack(fill=tk.BOTH, expand=True, padx=10, pady=1)

        self.fps = tk.Label(master)
        self.fps.pack(padx=10, pady=10)

        return btn

    def cancel(self):
        self.root.destroy()
        self.vidcap.release()

    def take_snapshot(self):
        """ Take snapshot and save to file """
        ts = datetime.datetime.now()
        filename = '{}.jpg'.format(ts.strftime('%Y-%m-%d_%H-%M-%S'))
        p = os.path.join('./', filename)
        self.capman.writeImage(p)

    def open_settings(self):
        self.vidcap.set(cv.CAP_PROP_SETTINGS, 1)

    def show_frame(self, frame):
        frameImage = Image.fromarray(cv.cvtColor(frame, cv.COLOR_BGR2RGBA))
        self.panel.imgTk = ImageTk.PhotoImage(image=frameImage)
        self.panel.config(image=self.panel.imgTk)

    def video_loop(self):
        self.capman.enterFrame()
        frame = self.capman.frame

        self.show_frame(frame)

        self.capman.exitFrame()
        self.fps.config(text='fps : {:2.0f}'.format(self.capman.fpsEstimate))
        self.root.after(20, self.video_loop)
Ejemplo n.º 5
0
class Camera:
    def __init__(self, source):

        # api
        self.api = cv.CAP_ANY

        # source
        self.source = source
        self.iscam = False
        if source.isdigit():
            self.source = int(source)
            self.iscam = True
            if sys.platform == 'win32':
                # adapt api on windows
                self.api = cv.CAP_DSHOW

        self.preview = WindowManager('preview', self.onKeypress)
        self.capture = CaptureManager(cv.VideoCapture(self.source, self.api),
                                      self.preview)

        self.capture.width = 640
        self.capture.height = 480
        self.h_mirror = False
        self.v_mirror = False

        if self.capture.fpsAnnounced > 0:
            self.preview.waitKeyDelay = int(1000.0 / self.capture.fpsAnnounced)

    def run(self):
        self.preview.createWindow()

        while True:
            # enter frame
            self.capture.enterFrame()
            frame = self.capture.frame

            if frame is None:
                break

            # process frame
            # ex : horizontal mirror
            if self.h_mirror:
                frame[:, ::-1, :] = frame
            # ex : vertical mirror
            if self.v_mirror:
                frame[::-1, :, :] = frame

            # display infos
            self.display_infos(frame)

            # exit frame
            self.capture.exitFrame()

        self.preview.destroyWindow()

    def display_infos(self, frame):
        info_text = """{}x{} {:2.0f}fps [{:2.0f}fps] {}{} {}ms - {:4d} frames""".format(
            self.capture.width,
            self.capture.height,
            self.capture.fpsEstimate,
            self.capture.fpsAnnounced,
            'H' if self.h_mirror else 'h',
            'V' if self.v_mirror else 'v',
            self.preview.waitKeyDelay,
            self.capture.framesElapsed,
        )
        cv.putText(frame,
                   text=info_text,
                   org=(15, 15),
                   fontFace=cv.FONT_HERSHEY_SIMPLEX,
                   fontScale=0.5,
                   color=(0, 0, 0),
                   thickness=1)
        cv.putText(frame,
                   text=info_text,
                   org=(14, 14),
                   fontFace=cv.FONT_HERSHEY_SIMPLEX,
                   fontScale=0.5,
                   color=(0, 215, 255),
                   thickness=1)

    def onKeypress(self, keycode):
        """
        keypress manager
        """
        if keycode == 27 or keycode == ord('q'):
            self.capture.camera.release()
        elif keycode == ord('i'):
            self.capture.openSettings()
        elif keycode == ord('h'):
            self.h_mirror = not self.h_mirror
        elif keycode == ord('v'):
            self.v_mirror = not self.v_mirror
        elif keycode == ord('1'):
            self.capture.width = 320
            self.capture.height = 240
        elif keycode == ord('2'):
            self.capture.width = 640
            self.capture.height = 480
        elif keycode == ord('+'):
            self.preview.waitKeyDelay += 1
        elif keycode == ord('-'):
            self.preview.waitKeyDelay -= 1
            if self.preview.waitKeyDelay < 1:
                self.preview.waitKeyDelay = 1
Ejemplo n.º 6
0
class Cameo:
    def __init__(self, source=0):
        if isinstance(source, int):
            camera = cv.VideoCapture(source, cv.CAP_DSHOW)
        else:
            camera = cv.VideoCapture(source)
        self.win = WindowManager('Cameo', self.onKeypress)
        self.capture = CaptureManager(camera=camera,
                                      previewWindowManager=self.win,
                                      shouldMirrorPreview=False)
        self.capture.width = 800
        self.capture.height = 448
        self._filter = None
        self._display = True

    def run(self):
        """Run the main loop."""
        self.win.createWindow()
        while self.win.isCreated:
            self.capture.enterFrame()
            frame = self.capture.frame

            # filters
            if self._filter is not None:
                self._filter.apply(frame, frame)

            # show infos ?
            if self._display:
                H, W = frame.shape[:2]
                info = [('Size', '{}x{}'.format(self.capture.width,
                                                self.capture.height)),
                        ('Filter', self._filter.__class__.__name__),
                        ('Elapsed', self.capture.framesElapsed),
                        ('FPS/cv', self.capture.camera.get(cv.CAP_PROP_FPS)),
                        ('FPS', '{:2.0f}'.format(self.capture.fpsEstimate))]
                for (i, (k, v)) in enumerate(info):
                    text = "{}: {}".format(k, v)
                    cv.putText(frame, text, (10, H - ((i * 15) + 15)),
                               cv.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 1)

            self.capture.exitFrame()
            self.win.processEvents()

    def onKeypress(self, keycode):
        """Handle a keypress.

        space  -> Take a screenshot.
        tab    -> Start/stop recording a screencast.
        escape -> Quit
        """
        if keycode == 32:  # space
            self.capture.writeImage('screenshot.png')
        elif keycode == 9:  # tab
            if not self.capture.isWritingVideo:
                self.capture.startWritingVideo('screencast.avi', 'XVID')
            else:
                self.capture.stopWritingVideo()
        elif keycode == 27 or keycode == ord('q'):  # 27 = escape
            self.capture.camera.release()
            self.win.destroyWindow()
        elif keycode == ord('b'):
            self._filter = filters.BlurFilter()
        elif keycode == ord('g'):
            self._filter = filters.FindEdgesFilter()
        elif keycode == ord('!'):
            self._filter = filters.StrokeEdgesFilter()
        elif keycode == ord('e'):
            self._filter = filters.EmbossFilter()
        elif keycode == ord('s'):
            self._filter = filters.SharpenFilter()
        elif keycode == ord('G'):
            self._filter = filters.GaussianBlurFilter(kernel=(21, 21))
        elif keycode == ord('c'):
            self._filter = filters.CannyEdgesFilter(threshold=30,
                                                    overlay=False)
        elif keycode == ord('i'):
            self._display = not self._display
        elif keycode == ord('p'):
            self.capture.openSettings()
        elif keycode == ord('x'):
            self._filter = None
Ejemplo n.º 7
0
class Application:
    def __init__(self):

        self.root = root = tk.Tk()
        root.title("Webcam capture")

        self.vidcap = cv.VideoCapture(0, cv.CAP_DSHOW)
        self.capman = CaptureManager(self.vidcap)
        self.capcfg = CameraSettings(self.vidcap)

        self.filter = None

        body = tk.Frame(root)
        self.initial_focus = self.body(body)
        body.pack(padx=5, pady=5)

        root.grab_set()

        if not self.initial_focus:
            self.initial_focus = root

        root.protocol('WM_DELETE_WINDOW', self.cancel)
        self.initial_focus.focus_set()

        self.video_loop()
        self.refresh_stats()

    def body(self, master):
        self.panel = tk.Label(master)
        self.panel.pack(padx=10, pady=10)

        btnGroup = tk.Frame(master)
        btnGroup.pack(fill=tk.X, expand=True, padx=10, pady=10)
        for btn in (
                'Réglages',
                'Dump',
                'Velvia',
                'XProcess',
                'Stroke Edges',
                'Canny Edges',
                'Threshold',
        ):
            tk.Button(btnGroup,
                      text=' ' + btn + ' ',
                      command=functools.partial(self.do_action, btn)).pack(
                          side=tk.LEFT,
                          fill=tk.X,
                          expand=True,
                          padx=5,
                      )

        btnSnap = tk.Button(master,
                            text="Snapshot !",
                            command=self.take_snapshot)
        btnSnap.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        self.fps = tk.Label(master)
        self.fps.pack(side=tk.LEFT, padx=10, pady=10)

        return btnSnap

    def cancel(self):
        self.root.destroy()
        self.vidcap.release()

    def take_snapshot(self):
        """ Take snapshot and save to file """
        ts = datetime.datetime.now()
        filename = '{}.jpg'.format(ts.strftime('%Y-%m-%d_%H-%M-%S'))
        p = os.path.join('./', filename)
        self.capman.writeImage(p)

    def do_action(self, action):
        if action == 'Réglages':
            self.capcfg.openSettings()
        elif action == 'Dump':
            print(self.capcfg.settings)
        elif action == 'Velvia':
            self.filter = filters.BGRVelviaCurveFilter()
        elif action == 'XProcess':
            self.filter = filters.BGRCrossProcessCurveFilter()
        elif action == 'Stroke Edges':
            self.filter = filters.StrokeEdgesFilter()
        elif action == 'Canny Edges':
            self.filter = filters.CannyEdgesFilter(threshold=30)
        elif action == 'Threshold':
            self.filter = filters.ThresholdFilter()

    def refresh_stats(self):
        self.fps.config(text='{:.2f}'.format(self.capman.fpsEstimate))

    def show_frame(self, frame):
        # convert to PIL Image (change colorspace BGR -> RGBA)
        frameImage = Image.fromarray(cv.cvtColor(frame, cv.COLOR_BGR2RGBA))
        # convert to PhotoImage (keep reference into self.panel)
        self.panel.imgTk = ImageTk.PhotoImage(image=frameImage)
        self.panel.config(image=self.panel.imgTk)

    def video_loop(self):
        self.capman.enterFrame()
        frame = self.capman.frame

        if self.filter is not None:
            self.filter.apply(frame, frame)

        self.show_frame(frame)

        self.capman.exitFrame()
        self.refresh_stats()

        self.root.after(20, self.video_loop)