Sep-11-2020, 06:57 AM
hello guys, i have experimented with PAGE gui builder and i-m a little stuck, the scenario is this i run the code, the app starts, it has a canvas for displaying the camera feed and a button, press the button it takes a snapshot.
after two days of experimenting and reading forums i have made it to work but ... the pictures are too small because they take the canvas size which is to small so before resolving the size ... i want to align the camera frame in the center of canvas
img 1
img 2
img 3
after two days of experimenting and reading forums i have made it to work but ... the pictures are too small because they take the canvas size which is to small so before resolving the size ... i want to align the camera frame in the center of canvas
img 1
img 2
img 3
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# GUI module generated by PAGE version 5.4
# in conjunction with Tcl version 8.6
# Sep 04, 2020 04:46:23 PM +0200 platform: Windows NT
import sys
try:
import Tkinter as tk
except ImportError:
import tkinter as tk
try:
import ttk
py3 = False
except ImportError:
import tkinter.ttk as ttk
py3 = True
import snapshot_support
##################tutorial################
import cv2
import PIL.Image, PIL.ImageTk
import time
def vp_start_gui():
'''Starting point when module is the main routine.'''
global val, w, root
root = tk.Tk()
top = scannerApp (root)
snapshot_support.init(root, top)
root.mainloop()
w = None
def create_scannerApp(rt, *args, **kwargs):
'''Starting point when module is imported by another module.
Correct form of call: 'create_scannerApp(root, *args, **kwargs)' .'''
global w, w_win, root
#rt = root
root = rt
w = tk.Toplevel (root)
top = scannerApp (w)
snapshot_support.init(w, top, *args, **kwargs)
return (w, top)
def destroy_scannerApp():
global w
w.destroy()
w = None
class scannerApp:
def __init__(self, top=None, video_source=1):
'''This class configures and populates the toplevel window.
top is the toplevel containing window.'''
_bgcolor = '#d9d9d9' # X11 color: 'gray85'
_fgcolor = '#000000' # X11 color: 'black'
_compcolor = '#d9d9d9' # X11 color: 'gray85'
_ana1color = '#d9d9d9' # X11 color: 'gray85'
_ana2color = '#ececec' # Closest X11 color: 'gray92'
top.geometry("600x450+420+128")
top.minsize(120, 1)
top.maxsize(1370, 749)
top.resizable(1, 1)
top.title("scaner")
top.configure(background="#d9d9d9")
self.video_source = video_source
# open video source (by default this will try to open the computer webcam)
self.vid = MyVideoCapture(self.video_source)
# Create a canvas
self.Canvas1 = tk.Canvas(top)
self.Canvas1.place(relx=0.05, rely=0.244, relheight=0.533
, relwidth=0.533)
self.Canvas1.configure(background="#d9d9d9")
self.Canvas1.configure(borderwidth="2")
self.Canvas1.configure(insertbackground="black")
self.Canvas1.configure(relief="ridge")
self.Canvas1.configure(selectbackground="blue")
self.Canvas1.configure(selectforeground="white")
self.startFeedButton = tk.Button(top)
self.startFeedButton.place(relx=0.05, rely=0.022, height=34, width=207)
self.startFeedButton.configure(activebackground="#ececec")
self.startFeedButton.configure(activeforeground="#000000")
self.startFeedButton.configure(background="#d9d9d9")
self.startFeedButton.configure(disabledforeground="#a3a3a3")
self.startFeedButton.configure(foreground="#000000")
self.startFeedButton.configure(highlightbackground="#d9d9d9")
self.startFeedButton.configure(highlightcolor="black")
self.startFeedButton.configure(pady="0")
self.startFeedButton.configure(text='''start''')
self.snapshotButton = tk.Button(top)
self.snapshotButton.place(relx=0.05, rely=0.133, height=34, width=207)
self.snapshotButton.configure(activebackground="#ececec")
self.snapshotButton.configure(activeforeground="#000000")
self.snapshotButton.configure(background="#d9d9d9")
self.snapshotButton.configure(disabledforeground="#a3a3a3")
self.snapshotButton.configure(foreground="#000000")
self.snapshotButton.configure(highlightbackground="#d9d9d9")
self.snapshotButton.configure(highlightcolor="black")
self.snapshotButton.configure(pady="0")
self.snapshotButton.configure(text='''snapshot''', command=self.snapshot)
# After it is called once, the update method will be automatically called every delay milliseconds
self.delay = 15
self.update()
self.Canvas1.mainloop()
def snapshot(self):
# Get a frame from the video source
ret, frame = self.vid.get_frame()
if ret:
cv2.imwrite("frame-" + time.strftime("%d-%m-%Y-%H-%M-%S") + ".jpg", cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))
def update(self):
# Get a frame from the video source
ret, frame = self.vid.get_frame()
if ret:
self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))
self.Canvas1.create_image(0, 0, image = self.photo, anchor = tk.NW)
self.Canvas1.after(self.delay, self.update)
class MyVideoCapture:
def __init__(self, video_source=1):
# Open the video source
self.vid = cv2.VideoCapture(video_source)
if not self.vid.isOpened():
raise ValueError("Unable to open video source", video_source)
# Get video source width and height
self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
# # set video with
# self.width = self.vid.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
# self.height = self.vid.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
def get_frame(self):
if self.vid.isOpened():
ret, frame = self.vid.read()
# newframe = cv2.resize(frame, (320, 240), fx = 0, fy = 0,
# interpolation = cv2.INTER_CUBIC)
if ret:
# Return a boolean success flag and the current frame converted to BGR
return (ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
else:
return (ret, None)
else:
return (ret, None)
# Release the video source when the object is destroyed
def __del__(self):
if self.vid.isOpened():
self.vid.release()
if __name__ == '__main__':
vp_start_gui()
