def __init__(self, config: tp.Dict[str, tp.Dict[str, tp.Any]]) -> None: """agent is initialized with state 0 and has an instance of Passport and Camera associated with it""" self.state: int = 0 self.config: tp.Dict[str, tp.Dict[str, tp.Any]] = config self.backend_api_address: str = config["api_address"][ "backend_api_address"] self.associated_passport: tp.Optional[Passport] = None self.associated_camera: Camera = Camera(self.config) self.latest_record_filename: str = "" self.latest_record_short_link: str = "" self.latest_record_qrpic_filename: str = ""
def getDeviceList(self): list = [] for i in range(5): if Camera(i).testIfExists() == True: list.append(i) return list
def changeCamera(self, x): self.camera.__del__() self.camera = Camera(self.variable1.get()) self.updateCameraParameters()
def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) self.settings = Settings.getInstance() ###AREA### self.left = None self.upper = None self.right = None self.lower = None ############ LEFT ############### optionsContainer = tk.Frame(self) optionsContainer.grid(row=0, column=0, sticky='N', columnspan=2) self.label9 = ttk.Label(optionsContainer, text='Camera Options', font='Helvetica 10 bold') self.label9.grid(row=0, column=0, columnspan=2) ### DEVICE NUMBER ### self.label1 = ttk.Label(optionsContainer, text='Device Number: ') self.label1.grid(row=1, column=0) self.devicelist = self.getDeviceList() self.devicelist.insert(0, self.devicelist[0]) self.variable1 = tk.StringVar(optionsContainer) self.variable1.set(self.devicelist[0]) self.dropdownmenu1 = ttk.OptionMenu(optionsContainer, self.variable1, *self.devicelist, command=self.changeCamera) self.dropdownmenu1.grid(row=1, column=1, sticky ='news') #set camera self.camera = Camera(int(self.variable1.get())) ### RESOLUTION ### self.label2 = ttk.Label(optionsContainer, text='Resolution:') self.label2.grid(row=2, column=0) self.resolutionlist = ["640x480","800x600", "1280x960", "1920x1080"] self.resolutionlist.insert(0, self.resolutionlist[0]) self.variable2 = tk.StringVar(optionsContainer) self.variable2.set(str(self.camera.getProperty(3))+"x"+str(self.camera.getProperty(4))) self.dropdownmenu2 = ttk.OptionMenu(optionsContainer, self.variable2, *self.resolutionlist, command=self.changeResolution) self.dropdownmenu2.grid(row=2, column=1, sticky ='news') # ### WHITE BALANCE ### # # self.label3 = ttk.Label(optionsContainer, text='White Balance:') # # self.label3.grid(row=3, column=0) # # self.whitebalancelist = ['on','off'] # # self.whitebalancelist.insert(0,self.whitebalancelist[0]) # # self.variable3 = tk.StringVar(optionsContainer) # # self.variable3.set(self.camera.getProperty(17)) # # self.dropdownmenu3 = ttk.OptionMenu(optionsContainer, self.variable3, *self.whitebalancelist, command=self.changeWhiteBalance) # # self.dropdownmenu3.grid(row=3, column=1, sticky='news') ### BRIGHTNESS ### self.label4 = ttk.Label(optionsContainer, text='Brightness:') self.label4.grid(row=4, column=0) self.defaultBrightnessVar = tk.StringVar(optionsContainer) self.defaultBrightnessVar.set(self.camera.getProperty(10)) self.spinbox1 = tk.Spinbox(optionsContainer, textvariable=self.defaultBrightnessVar, command=self.updateCameraParameters) self.spinbox1.grid(row=4, column=1) self.spinbox1.config(from_=0, to=10000, justify='right') ### CONTRAST ### self.label5 = tk.Label(optionsContainer, text='Contrast:') self.label5.grid(row=5, column=0) self.defaultContrastVar = tk.StringVar(optionsContainer) self.defaultContrastVar.set(self.camera.getProperty(11)) self.spinbox2 = tk.Spinbox(optionsContainer, textvariable=self.defaultContrastVar, command=self.updateCameraParameters) self.spinbox2.grid(row=5, column=1) self.spinbox2.config(from_=0, to=10000, justify='right') ### SATURATION ### self.label6 = tk.Label(optionsContainer, text='Saturation:') self.label6.grid(row=6, column=0) self.defaultSaturationVar = tk.StringVar(optionsContainer) self.defaultSaturationVar.set(self.camera.getProperty(12)) self.spinbox3 = tk.Spinbox(optionsContainer, textvariable=self.defaultSaturationVar, command=self.updateCameraParameters) self.spinbox3.grid(row=6, column=1) self.spinbox3.config(from_=0, to=10000, justify='right') ### GAIN ### self.label7 = ttk.Label(optionsContainer, text='Gain:') self.label7.grid(row=7, column=0) self.defaultGainVar = tk.StringVar(optionsContainer) self.defaultGainVar.set(self.camera.getProperty(14)/10000000) self.spinbox4 = tk.Spinbox(optionsContainer, textvariable=self.defaultGainVar, command=self.updateCameraParameters) self.spinbox4.grid(row=7, column=1) self.spinbox4.config(from_=0, to=100, justify='right') ############ AREA ################# areaContainer = tk.Frame(self) areaContainer.grid(row=1, column=0, sticky='N', columnspan=2) self.label10 = ttk.Label(areaContainer, text='Area Settings', font='Helvetica 10 bold') self.label10.grid(row=0, column=0, columnspan=2) self.scrollbar = ttk.Scrollbar(areaContainer, orient='vertical') self.scrollbar.grid(row=1, column=2, sticky='WNS') self.listbox = tk.Listbox(areaContainer, selectmode='EXTENDED') self.listbox.grid(row=1, column=0, sticky='WE', columnspan=2) self.listbox.config(yscrollcommand=self.scrollbar.set) self.scrollbar.config(command=self.listbox.yview) self.addareabutton = ttk.Button(areaContainer, text='Add', command=self.addAreaFunc) self.addareabutton.grid(row=2, column=0, sticky='W') self.deletebutton = ttk.Button(areaContainer, text='Delete', command=self.deleteSelection) self.deletebutton.grid(row=2, column=1, sticky='W') ################ MAKE DATA OPTIONS ################### self.makeDataContainer = tk.Frame(self) self.makeDataContainer.grid(row=2, column=0, sticky='N', columnspan=2) self.label11 = ttk.Label(self.makeDataContainer, text='Make Data Settings', font='Helvetica 10 bold') self.label11.grid(row=0, column=0, columnspan=3) self.label12 = ttk.Label(self.makeDataContainer, text='Making Data Time method: ') self.label12.grid(row=1, column=0) self.makeDataTimeList = ['Count of Photos', 'Count of Time'] self.makeDataTimeList.insert(0, self.makeDataTimeList[0]) self.variable4 = tk.StringVar(self.makeDataContainer) self.variable4.set(self.makeDataTimeList[0]) self.dropdownmenu4 = ttk.OptionMenu(self.makeDataContainer, self.variable4, *self.makeDataTimeList, command=self.makeDataTimeMethodInterfaceUpdate) self.dropdownmenu4.grid(row=1, column=1, sticky='news') self.label13 = ttk.Label(self.makeDataContainer, text='Making Data Photo method: ') self.label13.grid(row=2, column=0) self.makeDataPhotoList = ['Count of Frames'] self.makeDataPhotoList.insert(0, self.makeDataPhotoList[0]) self.variable5 = tk.StringVar(self.makeDataContainer) self.variable5.set(self.makeDataPhotoList[0]) self.dropdownmenu5 = ttk.OptionMenu(self.makeDataContainer, self.variable5, *self.makeDataPhotoList, command='') self.dropdownmenu5.grid(row=2, column=1, sticky='news') self.makeDataFramesContainer = tk.Frame(self.makeDataContainer) self.makeDataFramesContainer.grid(row=2, column=2) self.makeDataFramesSpinboxVar = tk.StringVar(self.makeDataFramesContainer) self.makeDataCountOfFramesSpinbox = tk.Spinbox(self.makeDataFramesContainer, from_=0, to=144, textvariable=self.makeDataFramesSpinboxVar, width=21, command=self.makeDataUpdateCountOfFrames) self.makeDataCountOfFramesSpinbox.grid(row=0, column=0) ################# LOAD/SAVE ################## loadsaveContainer = tk.Frame(self) loadsaveContainer.grid(row=3, column=0, sticky='N', columnspan=2) self.loadButton = ttk.Button(loadsaveContainer, text='Load Config', command=self.loadConfig) self.loadButton.grid(row=1, column=0, sticky='W', pady=5) self.saveButton = ttk.Button(loadsaveContainer, text='Save Config', command=self.saveConfig) self.saveButton.grid(row=1, column=1, sticky='W', pady=5) ############# PORT ################# self.portName = '' portContainer = tk.Frame(self) portContainer.grid(row=4, column=0, sticky='N', columnspan=2) self.label12 = ttk.Label(portContainer, text='Port Settings', font='Helvetica 10 bold') self.label12.grid(row=0, column=0, columnspan=3) self.portLabel = ttk.Label(portContainer, text=str(self.settings.portName)) self.portLabel.grid(row=1, column=1, sticky='W', pady=5) self.portEntry = ttk.Button(portContainer, text="Enter Port Name:", command=self.portEntryMethod) self.portEntry.grid(row=1, column=0, sticky='W', pady=5) ############ RIGHT ############### cameraCheckContainer = tk.Frame(self) cameraCheckContainer.grid(row=0, column=2, rowspan=2, sticky='N') ### CAMERA PREVIEW CHECK ### self.checkVar = tk.IntVar() self.checkbutton = tk.Checkbutton(cameraCheckContainer, variable=self.checkVar, text='Camera Preview', command=self.checkClick) self.checkbutton.grid(row=0, column=0, sticky='W') cameraContainer = tk.Frame(cameraCheckContainer) cameraContainer.grid(row=1, column=0, rowspan=2, sticky='N') ### CAMERA PREVIEW ### self.cameraWindow = tk.Canvas(cameraContainer, width=640, height=480) self.cameraWindow.grid(row=0, column=0, columnspan=2) self.delayOptions = 2000 self.delay = 18 self.updateCameraParameters() self.update() self.makeDataTimeMethodInterfaceUpdate('') self.updateAreasFromOptions() self.makeDataFramesSetFromOptions() self.updateOptions()
class Options(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) self.settings = Settings.getInstance() ###AREA### self.left = None self.upper = None self.right = None self.lower = None ############ LEFT ############### optionsContainer = tk.Frame(self) optionsContainer.grid(row=0, column=0, sticky='N', columnspan=2) self.label9 = ttk.Label(optionsContainer, text='Camera Options', font='Helvetica 10 bold') self.label9.grid(row=0, column=0, columnspan=2) ### DEVICE NUMBER ### self.label1 = ttk.Label(optionsContainer, text='Device Number: ') self.label1.grid(row=1, column=0) self.devicelist = self.getDeviceList() self.devicelist.insert(0, self.devicelist[0]) self.variable1 = tk.StringVar(optionsContainer) self.variable1.set(self.devicelist[0]) self.dropdownmenu1 = ttk.OptionMenu(optionsContainer, self.variable1, *self.devicelist, command=self.changeCamera) self.dropdownmenu1.grid(row=1, column=1, sticky ='news') #set camera self.camera = Camera(int(self.variable1.get())) ### RESOLUTION ### self.label2 = ttk.Label(optionsContainer, text='Resolution:') self.label2.grid(row=2, column=0) self.resolutionlist = ["640x480","800x600", "1280x960", "1920x1080"] self.resolutionlist.insert(0, self.resolutionlist[0]) self.variable2 = tk.StringVar(optionsContainer) self.variable2.set(str(self.camera.getProperty(3))+"x"+str(self.camera.getProperty(4))) self.dropdownmenu2 = ttk.OptionMenu(optionsContainer, self.variable2, *self.resolutionlist, command=self.changeResolution) self.dropdownmenu2.grid(row=2, column=1, sticky ='news') # ### WHITE BALANCE ### # # self.label3 = ttk.Label(optionsContainer, text='White Balance:') # # self.label3.grid(row=3, column=0) # # self.whitebalancelist = ['on','off'] # # self.whitebalancelist.insert(0,self.whitebalancelist[0]) # # self.variable3 = tk.StringVar(optionsContainer) # # self.variable3.set(self.camera.getProperty(17)) # # self.dropdownmenu3 = ttk.OptionMenu(optionsContainer, self.variable3, *self.whitebalancelist, command=self.changeWhiteBalance) # # self.dropdownmenu3.grid(row=3, column=1, sticky='news') ### BRIGHTNESS ### self.label4 = ttk.Label(optionsContainer, text='Brightness:') self.label4.grid(row=4, column=0) self.defaultBrightnessVar = tk.StringVar(optionsContainer) self.defaultBrightnessVar.set(self.camera.getProperty(10)) self.spinbox1 = tk.Spinbox(optionsContainer, textvariable=self.defaultBrightnessVar, command=self.updateCameraParameters) self.spinbox1.grid(row=4, column=1) self.spinbox1.config(from_=0, to=10000, justify='right') ### CONTRAST ### self.label5 = tk.Label(optionsContainer, text='Contrast:') self.label5.grid(row=5, column=0) self.defaultContrastVar = tk.StringVar(optionsContainer) self.defaultContrastVar.set(self.camera.getProperty(11)) self.spinbox2 = tk.Spinbox(optionsContainer, textvariable=self.defaultContrastVar, command=self.updateCameraParameters) self.spinbox2.grid(row=5, column=1) self.spinbox2.config(from_=0, to=10000, justify='right') ### SATURATION ### self.label6 = tk.Label(optionsContainer, text='Saturation:') self.label6.grid(row=6, column=0) self.defaultSaturationVar = tk.StringVar(optionsContainer) self.defaultSaturationVar.set(self.camera.getProperty(12)) self.spinbox3 = tk.Spinbox(optionsContainer, textvariable=self.defaultSaturationVar, command=self.updateCameraParameters) self.spinbox3.grid(row=6, column=1) self.spinbox3.config(from_=0, to=10000, justify='right') ### GAIN ### self.label7 = ttk.Label(optionsContainer, text='Gain:') self.label7.grid(row=7, column=0) self.defaultGainVar = tk.StringVar(optionsContainer) self.defaultGainVar.set(self.camera.getProperty(14)/10000000) self.spinbox4 = tk.Spinbox(optionsContainer, textvariable=self.defaultGainVar, command=self.updateCameraParameters) self.spinbox4.grid(row=7, column=1) self.spinbox4.config(from_=0, to=100, justify='right') ############ AREA ################# areaContainer = tk.Frame(self) areaContainer.grid(row=1, column=0, sticky='N', columnspan=2) self.label10 = ttk.Label(areaContainer, text='Area Settings', font='Helvetica 10 bold') self.label10.grid(row=0, column=0, columnspan=2) self.scrollbar = ttk.Scrollbar(areaContainer, orient='vertical') self.scrollbar.grid(row=1, column=2, sticky='WNS') self.listbox = tk.Listbox(areaContainer, selectmode='EXTENDED') self.listbox.grid(row=1, column=0, sticky='WE', columnspan=2) self.listbox.config(yscrollcommand=self.scrollbar.set) self.scrollbar.config(command=self.listbox.yview) self.addareabutton = ttk.Button(areaContainer, text='Add', command=self.addAreaFunc) self.addareabutton.grid(row=2, column=0, sticky='W') self.deletebutton = ttk.Button(areaContainer, text='Delete', command=self.deleteSelection) self.deletebutton.grid(row=2, column=1, sticky='W') ################ MAKE DATA OPTIONS ################### self.makeDataContainer = tk.Frame(self) self.makeDataContainer.grid(row=2, column=0, sticky='N', columnspan=2) self.label11 = ttk.Label(self.makeDataContainer, text='Make Data Settings', font='Helvetica 10 bold') self.label11.grid(row=0, column=0, columnspan=3) self.label12 = ttk.Label(self.makeDataContainer, text='Making Data Time method: ') self.label12.grid(row=1, column=0) self.makeDataTimeList = ['Count of Photos', 'Count of Time'] self.makeDataTimeList.insert(0, self.makeDataTimeList[0]) self.variable4 = tk.StringVar(self.makeDataContainer) self.variable4.set(self.makeDataTimeList[0]) self.dropdownmenu4 = ttk.OptionMenu(self.makeDataContainer, self.variable4, *self.makeDataTimeList, command=self.makeDataTimeMethodInterfaceUpdate) self.dropdownmenu4.grid(row=1, column=1, sticky='news') self.label13 = ttk.Label(self.makeDataContainer, text='Making Data Photo method: ') self.label13.grid(row=2, column=0) self.makeDataPhotoList = ['Count of Frames'] self.makeDataPhotoList.insert(0, self.makeDataPhotoList[0]) self.variable5 = tk.StringVar(self.makeDataContainer) self.variable5.set(self.makeDataPhotoList[0]) self.dropdownmenu5 = ttk.OptionMenu(self.makeDataContainer, self.variable5, *self.makeDataPhotoList, command='') self.dropdownmenu5.grid(row=2, column=1, sticky='news') self.makeDataFramesContainer = tk.Frame(self.makeDataContainer) self.makeDataFramesContainer.grid(row=2, column=2) self.makeDataFramesSpinboxVar = tk.StringVar(self.makeDataFramesContainer) self.makeDataCountOfFramesSpinbox = tk.Spinbox(self.makeDataFramesContainer, from_=0, to=144, textvariable=self.makeDataFramesSpinboxVar, width=21, command=self.makeDataUpdateCountOfFrames) self.makeDataCountOfFramesSpinbox.grid(row=0, column=0) ################# LOAD/SAVE ################## loadsaveContainer = tk.Frame(self) loadsaveContainer.grid(row=3, column=0, sticky='N', columnspan=2) self.loadButton = ttk.Button(loadsaveContainer, text='Load Config', command=self.loadConfig) self.loadButton.grid(row=1, column=0, sticky='W', pady=5) self.saveButton = ttk.Button(loadsaveContainer, text='Save Config', command=self.saveConfig) self.saveButton.grid(row=1, column=1, sticky='W', pady=5) ############# PORT ################# self.portName = '' portContainer = tk.Frame(self) portContainer.grid(row=4, column=0, sticky='N', columnspan=2) self.label12 = ttk.Label(portContainer, text='Port Settings', font='Helvetica 10 bold') self.label12.grid(row=0, column=0, columnspan=3) self.portLabel = ttk.Label(portContainer, text=str(self.settings.portName)) self.portLabel.grid(row=1, column=1, sticky='W', pady=5) self.portEntry = ttk.Button(portContainer, text="Enter Port Name:", command=self.portEntryMethod) self.portEntry.grid(row=1, column=0, sticky='W', pady=5) ############ RIGHT ############### cameraCheckContainer = tk.Frame(self) cameraCheckContainer.grid(row=0, column=2, rowspan=2, sticky='N') ### CAMERA PREVIEW CHECK ### self.checkVar = tk.IntVar() self.checkbutton = tk.Checkbutton(cameraCheckContainer, variable=self.checkVar, text='Camera Preview', command=self.checkClick) self.checkbutton.grid(row=0, column=0, sticky='W') cameraContainer = tk.Frame(cameraCheckContainer) cameraContainer.grid(row=1, column=0, rowspan=2, sticky='N') ### CAMERA PREVIEW ### self.cameraWindow = tk.Canvas(cameraContainer, width=640, height=480) self.cameraWindow.grid(row=0, column=0, columnspan=2) self.delayOptions = 2000 self.delay = 18 self.updateCameraParameters() self.update() self.makeDataTimeMethodInterfaceUpdate('') self.updateAreasFromOptions() self.makeDataFramesSetFromOptions() self.updateOptions() def portEntryMethod(self): self.settings.portName = tksd.askstring('Port name','Enter serial port',initialvalue=str( self.settings.portName)) self.portLabel.config(text=str(self.settings.portName)) def updateMakeDataSettings(self): self.makeDataUpdateCountOfFrames() if self.variable4.get() == 'Count of Photos': self.makeDataTimeUpdateCountOfPhoto() if self.variable4.get() == 'Count of Time': self.makeDataTimeUpdateCountOfTimeH() self.makeDataTimeUpdateCountOfTimeM() self.makeDataTimeUpdateCountOfTimeS() def makeDataFramesSetFromOptions(self): settings = Settings.getInstance() if settings.countOfFrames != None: self.makeDataFramesSpinboxVar.set(str(settings.countOfFrames)) def makeDataUpdateCountOfFrames(self): settings = Settings.getInstance() settings.countOfFrames = int(self.makeDataFramesSpinboxVar.get()) def makeDataTimeUpdateCountOfPhoto(self): settings = Settings.getInstance() settings.countOfPhoto = int(self.makeDataTimeCountOfPhotosSpinboxVar.get()) def makeDataTimeUpdateCountOfTimeH(self): settings = Settings.getInstance() settings.countOfTimeH = int(self.makeDataTimeCountOfTimeHoursSpinboxVar.get()) def makeDataTimeUpdateCountOfTimeM(self): settings = Settings.getInstance() settings.countOfTimeM = int(self.makeDataTimeCountOfTimeMinutesSpinboxVar.get()) def makeDataTimeUpdateCountOfTimeS(self): settings = Settings.getInstance() settings.countOfTimeS = int(self.makeDataTimeCountOfTimeSecondsSpinboxVar.get()) def makeDataTimeSetFromOptions(self): settings = Settings.getInstance() if self.variable4.get() == 'Count of Photos': if settings.countOfPhoto != None: self.makeDataTimeCountOfPhotosSpinboxVar.set(str(settings.countOfPhoto)) if self.variable4.get() == 'Count of Time': if settings.countOfTimeH != None: self.makeDataTimeCountOfTimeHoursSpinboxVar.set(str(settings.countOfTimeH)) if settings.countOfTimeM != None: self.makeDataTimeCountOfTimeMinutesSpinboxVar.set(str(settings.countOfTimeM)) if settings.countOfTimeS != None: self.makeDataTimeCountOfTimeSecondsSpinboxVar.set(str(settings.countOfTimeS)) def makeDataTimeMethodInterfaceUpdate(self,option): if self.variable4.get() == 'Count of Photos': try: self.makeDataTimeCountOfTimeContainer.grid_forget() except: None self.makeDataTimeCountOfPhotosContainer = tk.Frame(self.makeDataContainer) self.makeDataTimeCountOfPhotosContainer.grid(row=1, column=2) self.makeDataTimeCountOfPhotosSpinboxVar = tk.StringVar(self.makeDataTimeCountOfPhotosContainer) self.makeDataTimeSetFromOptions() self.makeDataTimeCountOfPhotosSpinbox = tk.Spinbox(self.makeDataTimeCountOfPhotosContainer, from_=0, to=10000, textvariable=self.makeDataTimeCountOfPhotosSpinboxVar, width=21, command=self.makeDataTimeUpdateCountOfPhoto) self.makeDataTimeCountOfPhotosSpinbox.grid(row=0, column=0) if self.variable4.get() == 'Count of Time': try: self.makeDataTimeCountOfPhotosContainer.grid_forget() except: None self.makeDataTimeCountOfTimeContainer = tk.Frame(self.makeDataContainer) self.makeDataTimeCountOfTimeContainer.grid(row=1, column=2) self.makeDataTimeCountOfTimeHoursSpinboxVar = tk.StringVar(self.makeDataTimeCountOfTimeContainer) self.makeDataTimeCountOfTimeMinutesSpinboxVar = tk.StringVar(self.makeDataTimeCountOfTimeContainer) self.makeDataTimeCountOfTimeSecondsSpinboxVar = tk.StringVar(self.makeDataTimeCountOfTimeContainer) self.makeDataTimeSetFromOptions() self.makeDataTimeCountOfTimeHoursLabel = ttk.Label(self.makeDataTimeCountOfTimeContainer, text='h') self.makeDataTimeCountOfTimeHoursLabel.grid(row=0, column=1) self.makeDataTimeCountOfTimeHoursSpinbox = tk.Spinbox(self.makeDataTimeCountOfTimeContainer, from_=0, to=12, textvariable=self.makeDataTimeCountOfTimeHoursSpinboxVar, width=5, command=self.makeDataTimeUpdateCountOfTimeH) self.makeDataTimeCountOfTimeHoursSpinbox.grid(row=0, column=0) self.makeDataTimeCountOfTimeMinutesLabel = ttk.Label(self.makeDataTimeCountOfTimeContainer, text='m') self.makeDataTimeCountOfTimeMinutesLabel.grid(row=0, column=3) self.makeDataTimeCountOfTimeMinutesSpinbox = tk.Spinbox(self.makeDataTimeCountOfTimeContainer, from_=0, to=59, textvariable=self.makeDataTimeCountOfTimeMinutesSpinboxVar, width=5, command=self.makeDataTimeUpdateCountOfTimeM) self.makeDataTimeCountOfTimeMinutesSpinbox.grid(row=0, column=2) self.makeDataTimeCountOfTimeSecondsLabel = tk.Label(self.makeDataTimeCountOfTimeContainer, text='s') self.makeDataTimeCountOfTimeSecondsLabel.grid(row=0, column=5) self.makeDataTimeCountOfTimeSecondsSpinbox = tk.Spinbox(self.makeDataTimeCountOfTimeContainer, from_=0, to=59, textvariable=self.makeDataTimeCountOfTimeSecondsSpinboxVar, width=5, command=self.makeDataTimeUpdateCountOfTimeS) self.makeDataTimeCountOfTimeSecondsSpinbox.grid(row=0, column=4) def updateAreasFromOptions(self): settings = Settings.getInstance() for i in range(1,len(settings.areasList)): self.listbox.insert('end', '{}, {}, {}, {}'.format(settings.areasList[i][0], settings.areasList[i][1], settings.areasList[i][2], settings.areasList[i][3])) def changeResolution(self, something): self.updateCameraParameters() def changeWhiteBalance(self, something): self.updateCameraParameters() def addAreaFunc(self): start = time.time() while int(time.time() - start) < 2: ret, frame = self.camera.getFrame() cv2.imwrite('configure.png', frame) mouseCropper = MouseCropper() mouseCropper.configure('configure.png') self.left = mouseCropper.left self.upper = mouseCropper.upper self.right = mouseCropper.right self.lower = mouseCropper.lower os.remove('configure.png') self.listbox.insert('end', '{}, {}, {}, {}'.format(self.left, self.upper, self.right, self.lower)) self.updateSettings() def changeCamera(self, x): self.camera.__del__() self.camera = Camera(self.variable1.get()) self.updateCameraParameters() def updateSettings(self): settings = Settings.getInstance() settings.cameraNumber = int(self.variable1.get()) settings.cameraWidth = int(self.variable2.get().split('x')[0]) settings.cameraHeight = int(self.variable2.get().split('x')[1]) settings.cameraBrightness = int(self.defaultBrightnessVar.get()) settings.cameraContrast = int(self.defaultContrastVar.get()) settings.cameraSaturation = int(self.defaultSaturationVar.get()) settings.cameraGain = int(self.defaultGainVar.get()) * 10000000 # if self.variable3.get() == 'on': # settings.cameraWhiteBalance = 1 # else: # settings.cameraWhiteBalance = 0 settings.left = self.left settings.upper = self.upper settings.right = self.right settings.lower = self.lower if (self.left, self.upper, self.right, self.lower) not in settings.areasList: settings.areasList.append((self.left, self.upper, self.right, self.lower)) settings.countOfAreas = len(settings.areasList) def updateCameraParameters(self): self.updateSettings() settings = Settings.getInstance() self.camera.setProperty(3, settings.cameraWidth) self.camera.setProperty(4, settings.cameraHeight) self.camera.setProperty(10, settings.cameraBrightness) self.camera.setProperty(11, settings.cameraContrast) self.camera.setProperty(12, settings.cameraSaturation) self.camera.setProperty(14, settings.cameraGain) # self.camera.setProperty(17, settings.cameraWhiteBalance) def checkClick(self): if self.checkVar.get() == 0: self.checkVar.set(1) else: self.checkVar.set(0) def update(self): settings = Settings.getInstance() if self.checkVar.get(): ret, frame = self.camera.getFrame() if ret: for i in range(len(settings.areasList)): try: cv2.rectangle(frame, (settings.areasList[i][0], settings.areasList[i][1]), (settings.areasList[i][2], settings.areasList[i][3]), (0, 255, 0), 1) except: pass self.img = ImageTk.PhotoImage(master=self.cameraWindow, image=Image.fromarray(frame).resize((640, 480))) self.cameraWindow.create_image(0, 0, image=self.img, anchor='nw') if self.checkVar.get() == 0: self.cameraWindow.delete("all") self.after(self.delay, self.update) def updateOptions(self): self.updateCameraParameters() self.updateMakeDataSettings() self.after(self.delayOptions, self.updateOptions) def deleteSelection(self): items = self.listbox.curselection() itemToDel = self.listbox.get(self.listbox.curselection()) itemToDel = tuple(map(int,itemToDel.replace(" ", "").split(','))) pos = 0 for i in items: idx = int(i) - pos self.listbox.delete(idx, idx) pos = pos + 1 settings = Settings.getInstance() try: settings.areasList.remove(itemToDel) except: None def getDeviceList(self): list = [] for i in range(5): if Camera(i).testIfExists() == True: list.append(i) return list def loadConfig(self): Settings.loadJSON(filedialog.askopenfilename()) self.updateAreasFromOptions() self.makeDataFramesSetFromOptions() def saveConfig(self): self.updateSettings() Settings.saveJSON(filedialog.asksaveasfilename(defaultextension=".ini"))
def video_feed(): return Response(gen(Camera()), mimetype='multipart/x-mixed-replace; boundary=frame')
def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) settings = Settings.getInstance() self.camera = Camera(settings.cameraNumber) self.camera = settings.setCamProperties(self.camera) self.makeDataList = [] self.TempReader = TempReader() self.do_temp = False self.temperaturePort = settings.portName ############ LEFT ############### ################ MAKE DATA OPTIONS ################### self.makeDataContainer = tk.Frame(self) self.makeDataContainer.grid(row=0, column=0, sticky='N', columnspan=2) self.label11 = ttk.Label(self.makeDataContainer, text='Make Data Settings', font='Helvetica 10 bold') self.label11.grid(row=0, column=0, columnspan=3) self.label12 = ttk.Label(self.makeDataContainer, text='Making Data Time method: ') self.label12.grid(row=1, column=0) self.makeDataTimeList = ['Count of Photos', 'Count of Time'] self.makeDataTimeList.insert(0, self.makeDataTimeList[0]) self.variable4 = tk.StringVar(self.makeDataContainer) self.variable4.set(self.makeDataTimeList[0]) self.dropdownmenu4 = ttk.OptionMenu(self.makeDataContainer, self.variable4, *self.makeDataTimeList, command=self.makeDataTimeMethodInterfaceUpdate) self.dropdownmenu4.grid(row=1, column=1, sticky='news') self.label13 = ttk.Label(self.makeDataContainer, text='Making Data Photo method: ') self.label13.grid(row=2, column=0) self.makeDataPhotoList = ['Count of Frames'] self.makeDataPhotoList.insert(0, self.makeDataPhotoList[0]) self.variable5 = tk.StringVar(self.makeDataContainer) self.variable5.set(self.makeDataPhotoList[0]) self.dropdownmenu5 = ttk.OptionMenu(self.makeDataContainer, self.variable5, *self.makeDataPhotoList, command='') self.dropdownmenu5.grid(row=2, column=1, sticky='news') self.makeDataFramesContainer = tk.Frame(self.makeDataContainer) self.makeDataFramesContainer.grid(row=2, column=2) self.makeDataFramesSpinboxVar = tk.StringVar(self.makeDataFramesContainer) self.makeDataCountOfFramesSpinbox = tk.Spinbox(self.makeDataFramesContainer, from_=0, to=144, textvariable=self.makeDataFramesSpinboxVar, width=21, command=self.makeDataUpdateCountOfFrames) self.makeDataCountOfFramesSpinbox.grid(row=0, column=0) ############ AREA ################# areaContainer = tk.Frame(self) areaContainer.grid(row=1, column=0, sticky='N', columnspan=2) self.label10 = ttk.Label(areaContainer, text='Area Settings', font='Helvetica 10 bold') self.label10.grid(row=0, column=0, columnspan=2) self.scrollbar = ttk.Scrollbar(areaContainer, orient='vertical') self.scrollbar.grid(row=1, column=2, sticky='WNS') self.listbox = tk.Listbox(areaContainer, selectmode='EXTENDED') self.listbox.grid(row=1, column=0, sticky='WE', columnspan=2) self.listbox.config(yscrollcommand=self.scrollbar.set) self.scrollbar.config(command=self.listbox.yview) self.addareabutton = ttk.Button(areaContainer, text='Add', command=self.addAreaFunc) self.addareabutton.grid(row=2, column=0, sticky='W') self.deletebutton = ttk.Button(areaContainer, text='Delete', command=self.deleteSelection) self.deletebutton.grid(row=2, column=1, sticky='W') ################# START/CANCEL ################## self.async_loop = asyncio.get_event_loop() startstopContainer = tk.Frame(self) startstopContainer.grid(row=3, column=0, sticky='N', columnspan=2) self.startButton = ttk.Button(startstopContainer, text='Start', command=lambda: self.do_tasks(self.async_loop)) self.startButton.grid(row=1, column=0, sticky='W') self.stopButton = ttk.Button(startstopContainer, text='Cancel', command=self.cancel) self.stopButton.grid(row=1, column=1, sticky='W') ############ RIGHT ############### cameraCheckContainer = tk.Frame(self) cameraCheckContainer.grid(row=0, column=2, rowspan=2, sticky='N') ### CAMERA PREVIEW CHECK ### self.checkVar = tk.IntVar() self.checkbutton = tk.Checkbutton(cameraCheckContainer, variable=self.checkVar, text='Camera Preview', command=self.checkClick) self.checkbutton.grid(row=0, column=0, sticky='W') cameraContainer = tk.Frame(cameraCheckContainer) cameraContainer.grid(row=1, column=0, rowspan=2, sticky='N') ### CAMERA PREVIEW ### self.cameraWindow = tk.Canvas(cameraContainer, width=640, height=480) self.cameraWindow.grid(row=0, column=0, columnspan=2) ### PROGRESS BAR ### self.progressBarContainer = tk.Frame(self) self.progressBarContainer.grid(row=4, column=0, columnspan=4) self.progressBar = ttk.Progressbar(self.progressBarContainer, orient='horizontal', length=1050) self.progressBar.grid(row=0, column=0, sticky='EW') self.progressBar.config(maximum=150, value=0) self.delayOptions = 2000 self.delay = 18 self.updateCameraParameters() self.update() self.makeDataTimeMethodInterfaceUpdate('') self.updateAreasFromOptions() self.makeDataFramesSetFromOptions() self.updateOptions()
class Make(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) settings = Settings.getInstance() self.camera = Camera(settings.cameraNumber) self.camera = settings.setCamProperties(self.camera) self.makeDataList = [] self.TempReader = TempReader() self.do_temp = False self.temperaturePort = settings.portName ############ LEFT ############### ################ MAKE DATA OPTIONS ################### self.makeDataContainer = tk.Frame(self) self.makeDataContainer.grid(row=0, column=0, sticky='N', columnspan=2) self.label11 = ttk.Label(self.makeDataContainer, text='Make Data Settings', font='Helvetica 10 bold') self.label11.grid(row=0, column=0, columnspan=3) self.label12 = ttk.Label(self.makeDataContainer, text='Making Data Time method: ') self.label12.grid(row=1, column=0) self.makeDataTimeList = ['Count of Photos', 'Count of Time'] self.makeDataTimeList.insert(0, self.makeDataTimeList[0]) self.variable4 = tk.StringVar(self.makeDataContainer) self.variable4.set(self.makeDataTimeList[0]) self.dropdownmenu4 = ttk.OptionMenu(self.makeDataContainer, self.variable4, *self.makeDataTimeList, command=self.makeDataTimeMethodInterfaceUpdate) self.dropdownmenu4.grid(row=1, column=1, sticky='news') self.label13 = ttk.Label(self.makeDataContainer, text='Making Data Photo method: ') self.label13.grid(row=2, column=0) self.makeDataPhotoList = ['Count of Frames'] self.makeDataPhotoList.insert(0, self.makeDataPhotoList[0]) self.variable5 = tk.StringVar(self.makeDataContainer) self.variable5.set(self.makeDataPhotoList[0]) self.dropdownmenu5 = ttk.OptionMenu(self.makeDataContainer, self.variable5, *self.makeDataPhotoList, command='') self.dropdownmenu5.grid(row=2, column=1, sticky='news') self.makeDataFramesContainer = tk.Frame(self.makeDataContainer) self.makeDataFramesContainer.grid(row=2, column=2) self.makeDataFramesSpinboxVar = tk.StringVar(self.makeDataFramesContainer) self.makeDataCountOfFramesSpinbox = tk.Spinbox(self.makeDataFramesContainer, from_=0, to=144, textvariable=self.makeDataFramesSpinboxVar, width=21, command=self.makeDataUpdateCountOfFrames) self.makeDataCountOfFramesSpinbox.grid(row=0, column=0) ############ AREA ################# areaContainer = tk.Frame(self) areaContainer.grid(row=1, column=0, sticky='N', columnspan=2) self.label10 = ttk.Label(areaContainer, text='Area Settings', font='Helvetica 10 bold') self.label10.grid(row=0, column=0, columnspan=2) self.scrollbar = ttk.Scrollbar(areaContainer, orient='vertical') self.scrollbar.grid(row=1, column=2, sticky='WNS') self.listbox = tk.Listbox(areaContainer, selectmode='EXTENDED') self.listbox.grid(row=1, column=0, sticky='WE', columnspan=2) self.listbox.config(yscrollcommand=self.scrollbar.set) self.scrollbar.config(command=self.listbox.yview) self.addareabutton = ttk.Button(areaContainer, text='Add', command=self.addAreaFunc) self.addareabutton.grid(row=2, column=0, sticky='W') self.deletebutton = ttk.Button(areaContainer, text='Delete', command=self.deleteSelection) self.deletebutton.grid(row=2, column=1, sticky='W') ################# START/CANCEL ################## self.async_loop = asyncio.get_event_loop() startstopContainer = tk.Frame(self) startstopContainer.grid(row=3, column=0, sticky='N', columnspan=2) self.startButton = ttk.Button(startstopContainer, text='Start', command=lambda: self.do_tasks(self.async_loop)) self.startButton.grid(row=1, column=0, sticky='W') self.stopButton = ttk.Button(startstopContainer, text='Cancel', command=self.cancel) self.stopButton.grid(row=1, column=1, sticky='W') ############ RIGHT ############### cameraCheckContainer = tk.Frame(self) cameraCheckContainer.grid(row=0, column=2, rowspan=2, sticky='N') ### CAMERA PREVIEW CHECK ### self.checkVar = tk.IntVar() self.checkbutton = tk.Checkbutton(cameraCheckContainer, variable=self.checkVar, text='Camera Preview', command=self.checkClick) self.checkbutton.grid(row=0, column=0, sticky='W') cameraContainer = tk.Frame(cameraCheckContainer) cameraContainer.grid(row=1, column=0, rowspan=2, sticky='N') ### CAMERA PREVIEW ### self.cameraWindow = tk.Canvas(cameraContainer, width=640, height=480) self.cameraWindow.grid(row=0, column=0, columnspan=2) ### PROGRESS BAR ### self.progressBarContainer = tk.Frame(self) self.progressBarContainer.grid(row=4, column=0, columnspan=4) self.progressBar = ttk.Progressbar(self.progressBarContainer, orient='horizontal', length=1050) self.progressBar.grid(row=0, column=0, sticky='EW') self.progressBar.config(maximum=150, value=0) self.delayOptions = 2000 self.delay = 18 self.updateCameraParameters() self.update() self.makeDataTimeMethodInterfaceUpdate('') self.updateAreasFromOptions() self.makeDataFramesSetFromOptions() self.updateOptions() #self.temperatureGetter() def temperatureGetter(self): self.currentTemp = self.TempReader.readTemp(self.temperaturePort) try: for i in self.makeDataList: i.currentTemp = self.currentTemp except: pass if self.do_temp: self.after(1000, self.temperatureGetter) def _asyncio_thread(self, async_loop): async_loop.run_until_complete(self.makeData()) def do_tasks(self, async_loop): """ Button-Event-Handler starting the asyncio part. """ threading.Thread(target=self._asyncio_thread, args=(async_loop,)).start() def makingData(self, makeDataObj): makeDataObj.camera = self.camera if self.variable4.get() == 'Count of Photos': makeDataObj.makingData(countOfPhoto=int(self.makeDataTimeCountOfPhotosSpinboxVar.get()), countOfFramesToAverage=int(self.makeDataFramesSpinboxVar.get())) if self.variable4.get() == 'Count of Time': makeDataObj.makingData(timeToExecute=[int(self.makeDataTimeCountOfTimeHoursSpinboxVar.get()), int(self.makeDataTimeCountOfTimeMinutesSpinboxVar.get()), int(self.makeDataTimeCountOfTimeSecondsSpinboxVar.get())], countOfFramesToAverage=int(self.makeDataFramesSpinboxVar.get())) async def makeData(self): #self.progressBar.start() settings = Settings.getInstance() self.do_temp = True self.temperatureGetter() self.countOfProcess = len(settings.areasList) - 1 threads = [] for i in range(self.countOfProcess): self.makeDataList.append(MakeData(settings.areasList[i+1])) t = threading.Thread(target=self.makingData, args=(self.makeDataList[i],)) threads.append(t) time.sleep(1) for i in threads: i.start() for i in threads: i.join() self.do_temp = False #self.progressBar.stop() for i in self.makeDataList: i.camera.release() def cancel(self): for i in self.makeDataList: i.do = False self.progressBar.stop() def updateMakeDataSettings(self): self.makeDataUpdateCountOfFrames() if self.variable4.get() == 'Count of Photos': self.makeDataTimeUpdateCountOfPhoto() if self.variable4.get() == 'Count of Time': self.makeDataTimeUpdateCountOfTimeH() self.makeDataTimeUpdateCountOfTimeM() self.makeDataTimeUpdateCountOfTimeS() def updateOptions(self): self.updateMakeDataSettings() self.after(self.delayOptions, self.updateOptions) def makeDataFramesSetFromOptions(self): settings = Settings.getInstance() if settings.countOfFrames != None: self.makeDataFramesSpinboxVar.set(str(settings.countOfFrames)) def makeDataUpdateCountOfFrames(self): settings = Settings.getInstance() settings.countOfFrames = int(self.makeDataFramesSpinboxVar.get()) def makeDataTimeUpdateCountOfPhoto(self): settings = Settings.getInstance() settings.countOfPhoto = int(self.makeDataTimeCountOfPhotosSpinboxVar.get()) def makeDataTimeUpdateCountOfTimeH(self): settings = Settings.getInstance() settings.countOfTimeH = int(self.makeDataTimeCountOfTimeHoursSpinboxVar.get()) def makeDataTimeUpdateCountOfTimeM(self): settings = Settings.getInstance() settings.countOfTimeM = int(self.makeDataTimeCountOfTimeMinutesSpinboxVar.get()) def makeDataTimeUpdateCountOfTimeS(self): settings = Settings.getInstance() settings.countOfTimeS = int(self.makeDataTimeCountOfTimeSecondsSpinboxVar.get()) def makeDataTimeSetFromOptions(self): settings = Settings.getInstance() if self.variable4.get() == 'Count of Photos': if settings.countOfPhoto != None: self.makeDataTimeCountOfPhotosSpinboxVar.set(str(settings.countOfPhoto)) if self.variable4.get() == 'Count of Time': if settings.countOfTimeH != None: self.makeDataTimeCountOfTimeHoursSpinboxVar.set(str(settings.countOfTimeH)) if settings.countOfTimeM != None: self.makeDataTimeCountOfTimeMinutesSpinboxVar.set(str(settings.countOfTimeM)) if settings.countOfTimeS != None: self.makeDataTimeCountOfTimeSecondsSpinboxVar.set(str(settings.countOfTimeS)) def makeDataTimeMethodInterfaceUpdate(self,option): if self.variable4.get() == 'Count of Photos': try: self.makeDataTimeCountOfTimeContainer.grid_forget() except: None self.makeDataTimeCountOfPhotosContainer = tk.Frame(self.makeDataContainer) self.makeDataTimeCountOfPhotosContainer.grid(row=1, column=2) self.makeDataTimeCountOfPhotosSpinboxVar = tk.StringVar(self.makeDataTimeCountOfPhotosContainer) self.makeDataTimeSetFromOptions() self.makeDataTimeCountOfPhotosSpinbox = tk.Spinbox(self.makeDataTimeCountOfPhotosContainer, from_=0, to=10000, textvariable=self.makeDataTimeCountOfPhotosSpinboxVar, width=21, command=self.makeDataTimeUpdateCountOfPhoto) self.makeDataTimeCountOfPhotosSpinbox.grid(row=0, column=0) if self.variable4.get() == 'Count of Time': try: self.makeDataTimeCountOfPhotosContainer.grid_forget() except: None self.makeDataTimeCountOfTimeContainer = tk.Frame(self.makeDataContainer) self.makeDataTimeCountOfTimeContainer.grid(row=1, column=2) self.makeDataTimeCountOfTimeHoursSpinboxVar = tk.StringVar(self.makeDataTimeCountOfTimeContainer) self.makeDataTimeCountOfTimeMinutesSpinboxVar = tk.StringVar(self.makeDataTimeCountOfTimeContainer) self.makeDataTimeCountOfTimeSecondsSpinboxVar = tk.StringVar(self.makeDataTimeCountOfTimeContainer) self.makeDataTimeSetFromOptions() self.makeDataTimeCountOfTimeHoursLabel = ttk.Label(self.makeDataTimeCountOfTimeContainer, text='h') self.makeDataTimeCountOfTimeHoursLabel.grid(row=0, column=1) self.makeDataTimeCountOfTimeHoursSpinbox = tk.Spinbox(self.makeDataTimeCountOfTimeContainer, from_=0, to=12, textvariable=self.makeDataTimeCountOfTimeHoursSpinboxVar, width=5, command=self.makeDataTimeUpdateCountOfTimeH) self.makeDataTimeCountOfTimeHoursSpinbox.grid(row=0, column=0) self.makeDataTimeCountOfTimeMinutesLabel = ttk.Label(self.makeDataTimeCountOfTimeContainer, text='m') self.makeDataTimeCountOfTimeMinutesLabel.grid(row=0, column=3) self.makeDataTimeCountOfTimeMinutesSpinbox = tk.Spinbox(self.makeDataTimeCountOfTimeContainer, from_=0, to=59, textvariable=self.makeDataTimeCountOfTimeMinutesSpinboxVar, width=5, command=self.makeDataTimeUpdateCountOfTimeM) self.makeDataTimeCountOfTimeMinutesSpinbox.grid(row=0, column=2) self.makeDataTimeCountOfTimeSecondsLabel = tk.Label(self.makeDataTimeCountOfTimeContainer, text='s') self.makeDataTimeCountOfTimeSecondsLabel.grid(row=0, column=5) self.makeDataTimeCountOfTimeSecondsSpinbox = tk.Spinbox(self.makeDataTimeCountOfTimeContainer, from_=0, to=59, textvariable=self.makeDataTimeCountOfTimeSecondsSpinboxVar, width=5, command=self.makeDataTimeUpdateCountOfTimeS) self.makeDataTimeCountOfTimeSecondsSpinbox.grid(row=0, column=4) def addAreaFunc(self): start = time.time() while int(time.time() - start) < 2: ret, frame = self.camera.getFrame() cv2.imwrite('configure.png', frame) mouseCropper = MouseCropper() mouseCropper.configure('configure.png') self.left = mouseCropper.left self.upper = mouseCropper.upper self.right = mouseCropper.right self.lower = mouseCropper.lower os.remove('configure.png') self.listbox.insert('end','{}, {}, {}, {}'.format(self.left, self.upper, self.right, self.lower)) self.updateSettings() def updateSettings(self): settings = Settings.getInstance() settings.left = self.left settings.upper = self.upper settings.right = self.right settings.lower = self.lower if (self.left, self.upper, self.right, self.lower) not in settings.areasList: settings.areasList.append((self.left, self.upper, self.right, self.lower)) settings.countOfAreas = len(settings.areasList) def updateAreasFromOptions(self): settings = Settings.getInstance() for i in range(1,len(settings.areasList)): self.listbox.insert('end', '{}, {}, {}, {}'.format(settings.areasList[i][0], settings.areasList[i][1], settings.areasList[i][2], settings.areasList[i][3])) def updateCameraParameters(self): # self.updateSettings() settings = Settings.getInstance() self.camera.setProperty(3, settings.cameraWidth) self.camera.setProperty(4, settings.cameraHeight) self.camera.setProperty(10, settings.cameraBrightness) self.camera.setProperty(11, settings.cameraContrast) self.camera.setProperty(12, settings.cameraSaturation) self.camera.setProperty(14, settings.cameraGain) #self.camera.setProperty(17, settings.cameraWhiteBalance) def checkClick(self): if self.checkVar.get() == 0: self.checkVar.set(1) else: self.checkVar.set(0) def update(self): settings = Settings.getInstance() if self.checkVar.get(): ret, frame = self.camera.getFrame() if ret: for i in range(len(settings.areasList)): try: cv2.rectangle(frame, (settings.areasList[i][0], settings.areasList[i][1]), (settings.areasList[i][2], settings.areasList[i][3]), (0, 255, 0), 1) except: pass self.img = ImageTk.PhotoImage(master=self.cameraWindow, image=Image.fromarray(frame).resize((640, 480))) self.cameraWindow.create_image(0, 0, image=self.img, anchor='nw') if self.checkVar.get() == 0: self.cameraWindow.delete("all") self.after(self.delay, self.update) def deleteSelection(self): items = self.listbox.curselection() itemToDel = self.listbox.get(self.listbox.curselection()) itemToDel = tuple(map(int,itemToDel.replace(" ", "").split(','))) pos = 0 for i in items: idx = int(i) - pos self.listbox.delete(idx, idx) pos = pos + 1 settings = Settings.getInstance() try: settings.areasList.remove(itemToDel) except: None
class RealTimeAnalysis(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) settings = Settings.getInstance() self.camera = Camera(settings.cameraNumber) self.delayOptions = 2000 self.delay = 18 self.realTimeList = [] self.TempReader = TempReader() self.current_Temp = 0 self.do_temp = False self.do_graph = False self.container = tk.Frame(self) self.container.grid() ############ AREA ################# areaContainer = tk.Frame(self.container) areaContainer.grid(row=0, column=0, columnspan=3, sticky='N') self.label10 = ttk.Label(areaContainer, text='Area Settings', font='Helvetica 10 bold') self.label10.grid(row=0, column=0, columnspan=3) self.scrollbar = ttk.Scrollbar(areaContainer, orient='vertical') self.scrollbar.grid(row=1, column=2, sticky='WNS') self.listbox = tk.Listbox(areaContainer, selectmode='EXTENDED') self.listbox.grid(row=1, column=0, columnspan=3, padx=5, sticky='WE') self.listbox.config(yscrollcommand=self.scrollbar.set) self.scrollbar.config(command=self.listbox.yview) self.addareabutton = ttk.Button(areaContainer, text='Add', command=self.addAreaFunc) self.addareabutton.grid(row=2, column=0) self.deletebutton = ttk.Button(areaContainer, text='Delete', command=self.deleteSelection) self.deletebutton.grid(row=2, column=1) ################ MAKE DATA OPTIONS ################### self.makeDataContainer = tk.Frame(self.container) self.makeDataContainer.grid(row=1, column=0, sticky='N', columnspan=3) self.label11 = ttk.Label(self.makeDataContainer, text='Make Data Settings', font='Helvetica 10 bold') self.label11.grid(row=0, column=0, columnspan=3) self.label12 = ttk.Label(self.makeDataContainer, text='Making Data Time method: ') self.label12.grid(row=1, column=0) self.makeDataTimeList = ['Count of Photos', 'Count of Time'] self.makeDataTimeList.insert(0, self.makeDataTimeList[0]) self.variable4 = tk.StringVar(self.makeDataContainer) self.variable4.set(self.makeDataTimeList[0]) self.dropdownmenu4 = ttk.OptionMenu( self.makeDataContainer, self.variable4, *self.makeDataTimeList, command=self.makeDataTimeMethodInterfaceUpdate) self.dropdownmenu4.grid(row=1, column=1, sticky='ew') self.label13 = ttk.Label(self.makeDataContainer, text='Making Data Photo method: ') self.label13.grid(row=2, column=0) self.makeDataPhotoList = ['Count of Frames'] self.makeDataPhotoList.insert(0, self.makeDataPhotoList[0]) self.variable5 = tk.StringVar(self.makeDataContainer) self.variable5.set(self.makeDataPhotoList[0]) self.dropdownmenu5 = ttk.OptionMenu(self.makeDataContainer, self.variable5, *self.makeDataPhotoList, command='') self.dropdownmenu5.grid(row=2, column=1, sticky='ew') self.makeDataFramesContainer = tk.Frame(self.makeDataContainer) self.makeDataFramesContainer.grid(row=2, column=2) self.makeDataFramesSpinboxVar = tk.StringVar( self.makeDataFramesContainer) self.makeDataCountOfFramesSpinbox = tk.Spinbox( self.makeDataFramesContainer, from_=0, to=144, textvariable=self.makeDataFramesSpinboxVar, width=21, command=self.makeDataUpdateCountOfFrames) self.makeDataCountOfFramesSpinbox.grid(row=0, column=0) ################# START/CANCEL ################## self.async_loop = asyncio.get_event_loop() startstopContainer = tk.Frame(self.container) startstopContainer.grid(row=2, column=0, sticky='N', columnspan=3) self.startButton = ttk.Button( startstopContainer, text='Start', command=lambda: self.do_tasks(self.async_loop)) self.startButton.grid(row=1, column=0) self.stopButton = ttk.Button(startstopContainer, text='Cancel', command=self.cancel) self.stopButton.grid(row=1, column=1) ############ RIGHT ############### cameraCheckContainer = tk.Frame(self.container) cameraCheckContainer.grid(row=0, column=3, rowspan=3) # ### CAMERA PREVIEW CHECK ### # self.checkVar = tk.IntVar() # self.checkbutton = tk.Checkbutton(cameraCheckContainer, variable=self.checkVar, text='Camera Preview', # command=self.checkClick) # self.checkbutton.grid(row=0, column=0, sticky='W') # # cameraContainer = tk.Frame(cameraCheckContainer) # cameraContainer.grid(row=1, column=0, rowspan=2, sticky='N') # ### CAMERA PREVIEW ### # self.cameraWindow = tk.Canvas(cameraContainer, width=640, height=480) # self.cameraWindow.grid(row=0, column=0, columnspan=2) self.makeClearGraph() self.updateAreasFromOptions() self.makeDataFramesSetFromOptions() #self.update() self.makeDataTimeMethodInterfaceUpdate('') self.createGraphSwitchers() self.drawGraph() def temperatureGetter(self): self.current_Temp = self.TempReader.readTemp(temperaturePort) try: for i in self.realTimeList: i.currentTemp = self.current_Temp except: pass if self.do_temp: self.after(1000, self.temperatureGetter) def createGraphSwitchers(self): try: self.switchersContainer.grid_forget() except: pass settings = Settings.getInstance() self.switchersContainer = tk.Frame(self) self.switchersContainer.grid(row=1, column=4, columnspan=2, sticky='N') self.areasList = [] try: for i in range(1, len(settings.areasList)): if settings.areasList[i] not in self.areasList: self.areasList.append(str(settings.areasList[i])) self.areasList.insert(0, self.areasList[0]) self.areasListVar = tk.StringVar(self.switchersContainer) self.areasListVar.set(self.areasList[0]) self.areasGraphOptionMenu = ttk.OptionMenu(self.switchersContainer, self.areasListVar, *self.areasList, command=self.drawGraph) self.areasGraphOptionMenu.grid(row=0, column=0) except: pass self.xList = ['temperature', 'time'] self.xList.insert(0, self.xList[0]) self.xListVar = tk.StringVar(self.switchersContainer) self.xListVar.set(self.xList[0]) self.xOptionMenu = ttk.OptionMenu(self.switchersContainer, self.xListVar, *self.xList, command=self.drawGraph) self.xOptionMenu.grid(row=0, column=1) def makeClearGraph(self): self.f = Figure(figsize=(8, 5), dpi=100) self.avg = self.f.add_subplot(111) self.Canvas = FigureCanvasTkAgg(self.f, master=self) self.Canvas.get_tk_widget().grid(row=0, column=4, columnspan=3) self.toolbar_frame = tk.Frame(self) self.Toolbar = NavigationToolbar2Tk(self.Canvas, self.toolbar_frame) self.Toolbar.update() self.toolbar_frame.grid(row=1, column=6) # self.toolbar_frame = tk.Frame(self) # self.Myfig = plt.figure() # self.Canvas = FigureCanvasTkAgg(self.Myfig, master=self) # self.Toolbar = NavigationToolbar2Tk(self.Canvas, self.toolbar_frame) # self.Toolbar.update() # self.toolbar_frame.grid(row=1, column=4) # self.Canvas._tkcanvas.grid(row=0, column=4) # self.avg = self.Myfig.add_subplot(111) def drawGraph(self, *args, **kwargs): try: area = self.areasListVar.get()[1:len(self.areasListVar.get()) - 1].split(',') area = [int(x) for x in area] area = tuple(area) for i in range(len(self.realTimeList)): if self.realTimeList[i].area == area: xtemp = self.realTimeList[i].tempList yred = self.realTimeList[i].avR ygreen = self.realTimeList[i].avG yblue = self.realTimeList[i].avB xtime = self.realTimeList[i].timeList osx = None if self.xListVar.get() == 'temperature': osx = xtemp xlabel = 'Temperature' if self.xListVar.get() == 'time': xlabel = 'Time' timelist = [] for i in range(len(xtime)): #timelist.append(time.strftime("%H:%M:%S", time.gmtime(xtime[i] - xtime[0]))) timelist.append(xtime[i] - xtime[0]) osx = timelist if osx != None: self.avg.clear() self.avg.plot(osx, yred, "ro", osx, ygreen, "go", osx, yblue, 'bo') self.avg.ticklabel_format(useOffset=False, style='plain') plt.ylabel('Average of pixels') plt.xlabel(xlabel) plt.setp(self.avg.get_xticklabels(), rotation=30, horizontalalignment='right') self.Canvas.draw() #self.Canvas.refresh() except: print("Exception w DrawGraph") pass if self.do_graph: self.after(1000, self.drawGraph) def checkClick(self): if self.checkVar.get() == 0: self.checkVar.set(1) else: self.checkVar.set(0) def update(self): settings = Settings.getInstance() if self.checkVar.get(): ret, frame = self.camera.getFrame() if ret: for i in range(len(settings.areasList)): try: cv2.rectangle(frame, (settings.areasList[i][0], settings.areasList[i][1]), (settings.areasList[i][2], settings.areasList[i][3]), (0, 255, 0), 1) except: pass self.img = ImageTk.PhotoImage( master=self.cameraWindow, image=Image.fromarray(frame).resize((640, 480))) self.cameraWindow.create_image(0, 0, image=self.img, anchor='nw') if self.checkVar.get() == 0: self.cameraWindow.delete("all") self.after(self.delay, self.update) def addAreaFunc(self): start = time.time() while int(time.time() - start) < 2: ret, frame = self.camera.getFrame() cv2.imwrite('configure.png', frame) mouseCropper = MouseCropper() mouseCropper.configure('configure.png') self.left = mouseCropper.left self.upper = mouseCropper.upper self.right = mouseCropper.right self.lower = mouseCropper.lower os.remove('configure.png') self.listbox.insert( 'end', '{}, {}, {}, {}'.format(self.left, self.upper, self.right, self.lower)) self.updateSettings() self.createGraphSwitchers() def deleteSelection(self): items = self.listbox.curselection() itemToDel = self.listbox.get(self.listbox.curselection()) itemToDel = tuple(map(int, itemToDel.replace(" ", "").split(','))) pos = 0 for i in items: idx = int(i) - pos self.listbox.delete(idx, idx) pos = pos + 1 settings = Settings.getInstance() try: settings.areasList.remove(itemToDel) except: pass def updateAreasFromOptions(self): settings = Settings.getInstance() for i in range(1, len(settings.areasList)): self.listbox.insert( 'end', '{}, {}, {}, {}'.format(settings.areasList[i][0], settings.areasList[i][1], settings.areasList[i][2], settings.areasList[i][3])) def updateSettings(self): settings = Settings.getInstance() settings.left = self.left settings.upper = self.upper settings.right = self.right settings.lower = self.lower if (self.left, self.upper, self.right, self.lower) not in settings.areasList: settings.areasList.append( (self.left, self.upper, self.right, self.lower)) settings.countOfAreas = len(settings.areasList) def _asyncio_thread(self, async_loop): async_loop.run_until_complete(self.makeData()) def cancel(self): for i in self.realTimeList: i.do = False def makingData(self, realTimeObj): settings = Settings.getInstance() if self.variable4.get() == 'Count of Photos': realTimeObj.countOfPhoto = int( self.makeDataTimeCountOfPhotosSpinboxVar.get()) realTimeObj.countOfPhotoDone = 0 realTimeObj.camera = self.camera #realTimeObj.camera = cv2.VideoCapture(settings.cameraNumber) realTimeObj.frames = int(self.makeDataFramesSpinboxVar.get()) realTimeObj.before() while realTimeObj.countOfPhotoDone < realTimeObj.countOfPhoto: if realTimeObj.do: realTimeObj.run() realTimeObj.countOfPhotoDone += 1 else: break realTimeObj.logFile.close() realTimeObj.analysisFile.close() if self.variable4.get() == 'Count of Time': realTimeObj.frames = int(self.makeDataFramesSpinboxVar.get()) realTimeObj.before() while realTimeObj.timePast() < realTimeObj.convertTimeToSeconds([ int(self.makeDataTimeCountOfTimeHoursSpinboxVar.get()), int(self.makeDataTimeCountOfTimeMinutesSpinboxVar.get()), int(self.makeDataTimeCountOfTimeSecondsSpinboxVar.get()) ]): if realTimeObj.do: realTimeObj.run() else: break realTimeObj.logFile.close() realTimeObj.analysisFile.close() async def makeData(self): settings = Settings.getInstance() self.do_temp = True self.do_graph = True self.temperatureGetter() self.drawGraph() self.countOfProcess = len(settings.areasList) - 1 threads = [] for i in range(self.countOfProcess): self.realTimeList.append(RealTime(settings.areasList[i + 1])) t = threading.Thread(target=self.makingData, args=(self.realTimeList[i], )) threads.append(t) time.sleep(1) for i in threads: i.start() for i in threads: i.join() self.do_temp = False self.do_graph = False def do_tasks(self, async_loop): """ Button-Event-Handler starting the asyncio part. """ threading.Thread(target=self._asyncio_thread, args=(async_loop, )).start() def makeDataTimeMethodInterfaceUpdate(self, *args, **kwargs): if self.variable4.get() == 'Count of Photos': try: self.makeDataTimeCountOfTimeContainer.grid_forget() except: pass self.makeDataTimeCountOfPhotosContainer = tk.Frame( self.makeDataContainer) self.makeDataTimeCountOfPhotosContainer.grid(row=1, column=2) self.makeDataTimeCountOfPhotosSpinboxVar = tk.StringVar( self.makeDataTimeCountOfPhotosContainer) self.makeDataTimeSetFromOptions() self.makeDataTimeCountOfPhotosSpinbox = tk.Spinbox( self.makeDataTimeCountOfPhotosContainer, from_=0, to=10000, textvariable=self.makeDataTimeCountOfPhotosSpinboxVar, width=21, command=self.makeDataTimeUpdateCountOfPhoto) self.makeDataTimeCountOfPhotosSpinbox.grid(row=0, column=0) if self.variable4.get() == 'Count of Time': try: self.makeDataTimeCountOfPhotosContainer.grid_forget() except: pass self.makeDataTimeCountOfTimeContainer = tk.Frame( self.makeDataContainer) self.makeDataTimeCountOfTimeContainer.grid(row=1, column=2) self.makeDataTimeCountOfTimeHoursSpinboxVar = tk.StringVar( self.makeDataTimeCountOfTimeContainer) self.makeDataTimeCountOfTimeMinutesSpinboxVar = tk.StringVar( self.makeDataTimeCountOfTimeContainer) self.makeDataTimeCountOfTimeSecondsSpinboxVar = tk.StringVar( self.makeDataTimeCountOfTimeContainer) self.makeDataTimeSetFromOptions() self.makeDataTimeCountOfTimeHoursLabel = ttk.Label( self.makeDataTimeCountOfTimeContainer, text='h') self.makeDataTimeCountOfTimeHoursLabel.grid(row=0, column=1) self.makeDataTimeCountOfTimeHoursSpinbox = tk.Spinbox( self.makeDataTimeCountOfTimeContainer, from_=0, to=12, textvariable=self.makeDataTimeCountOfTimeHoursSpinboxVar, width=5, command=self.makeDataTimeUpdateCountOfTimeH) self.makeDataTimeCountOfTimeHoursSpinbox.grid(row=0, column=0) self.makeDataTimeCountOfTimeMinutesLabel = ttk.Label( self.makeDataTimeCountOfTimeContainer, text='m') self.makeDataTimeCountOfTimeMinutesLabel.grid(row=0, column=3) self.makeDataTimeCountOfTimeMinutesSpinbox = tk.Spinbox( self.makeDataTimeCountOfTimeContainer, from_=0, to=59, textvariable=self.makeDataTimeCountOfTimeMinutesSpinboxVar, width=5, command=self.makeDataTimeUpdateCountOfTimeM) self.makeDataTimeCountOfTimeMinutesSpinbox.grid(row=0, column=2) self.makeDataTimeCountOfTimeSecondsLabel = tk.Label( self.makeDataTimeCountOfTimeContainer, text='s') self.makeDataTimeCountOfTimeSecondsLabel.grid(row=0, column=5) self.makeDataTimeCountOfTimeSecondsSpinbox = tk.Spinbox( self.makeDataTimeCountOfTimeContainer, from_=0, to=59, textvariable=self.makeDataTimeCountOfTimeSecondsSpinboxVar, width=5, command=self.makeDataTimeUpdateCountOfTimeS) self.makeDataTimeCountOfTimeSecondsSpinbox.grid(row=0, column=4) def updateMakeDataSettings(self): self.makeDataUpdateCountOfFrames() if self.variable4.get() == 'Count of Photos': self.makeDataTimeUpdateCountOfPhoto() if self.variable4.get() == 'Count of Time': self.makeDataTimeUpdateCountOfTimeH() self.makeDataTimeUpdateCountOfTimeM() self.makeDataTimeUpdateCountOfTimeS() def updateOptions(self): self.updateMakeDataSettings() self.after(self.delayOptions, self.updateOptions) def makeDataFramesSetFromOptions(self): settings = Settings.getInstance() if settings.countOfFrames != None: self.makeDataFramesSpinboxVar.set(str(settings.countOfFrames)) def makeDataUpdateCountOfFrames(self): settings = Settings.getInstance() settings.countOfFrames = int(self.makeDataFramesSpinboxVar.get()) def makeDataTimeUpdateCountOfPhoto(self): settings = Settings.getInstance() settings.countOfPhoto = int( self.makeDataTimeCountOfPhotosSpinboxVar.get()) def makeDataTimeUpdateCountOfTimeH(self): settings = Settings.getInstance() settings.countOfTimeH = int( self.makeDataTimeCountOfTimeHoursSpinboxVar.get()) def makeDataTimeUpdateCountOfTimeM(self): settings = Settings.getInstance() settings.countOfTimeM = int( self.makeDataTimeCountOfTimeMinutesSpinboxVar.get()) def makeDataTimeUpdateCountOfTimeS(self): settings = Settings.getInstance() settings.countOfTimeS = int( self.makeDataTimeCountOfTimeSecondsSpinboxVar.get()) def makeDataTimeSetFromOptions(self): settings = Settings.getInstance() if self.variable4.get() == 'Count of Photos': if settings.countOfPhoto != None: self.makeDataTimeCountOfPhotosSpinboxVar.set( str(settings.countOfPhoto)) if self.variable4.get() == 'Count of Time': if settings.countOfTimeH != None: self.makeDataTimeCountOfTimeHoursSpinboxVar.set( str(settings.countOfTimeH)) if settings.countOfTimeM != None: self.makeDataTimeCountOfTimeMinutesSpinboxVar.set( str(settings.countOfTimeM)) if settings.countOfTimeS != None: self.makeDataTimeCountOfTimeSecondsSpinboxVar.set( str(settings.countOfTimeS))