-
Notifications
You must be signed in to change notification settings - Fork 40
/
Qr_Camera.py
158 lines (143 loc) · 6.38 KB
/
Qr_Camera.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from tkinter import *
import tkinter.scrolledtext as scrolledtext
from tkinter import messagebox, filedialog
from pyzbar.pyzbar import decode, ZBarSymbol
import cv2
import pyautogui
import numpy as np
import threading
from PIL import Image, ImageTk, ImageDraw
import os
class App:
def __init__(self,font_video=0):
self.active_camera = False
self.info = []
self.codelist = []
self.appName = 'QR Code Reader'
self.ventana = Tk()
self.ventana.title(self.appName)
self.ventana['bg']='black'
self.font_video=font_video
Label(self.ventana,text=self.appName,font=15,bg='blue',
fg='white').pack(side=TOP,fill=BOTH)
Button(self.ventana,text="GUARDAR INFO",bg='light blue',command=self.guardar).pack(side=BOTTOM)
self.display=scrolledtext.ScrolledText(self.ventana,width=86,background='snow3'
,height=4,padx=10, pady=10,font=('Arial', 10))
self.display.pack(side=BOTTOM)
self.canvas=Canvas(self.ventana,bg='black',width=640,height=0)
self.canvas.pack()
Button(self.ventana,text="CARGAR ARCHIVO",width=29,bg='goldenrod2',activebackground='red',command=self.abrir).pack(side=LEFT)
self.btnCamera=Button(self.ventana,text="INICIAR LECTURA POR CAMARA",width=30,bg='goldenrod2',
activebackground='red',command=self.active_cam)
self.btnCamera.pack(side=LEFT)
Button(self.ventana,text="DETECTAR EN PANTALLA",width=29,bg='goldenrod2',activebackground='red',command=self.screen_shot).pack(side=RIGHT)
self.ventana.mainloop()
def guardar(self):
if len(self.display.get('1.0',END))>1:
documento = filedialog.asksaveasfilename(initialdir="/",
title="Guardar en",defaultextension='.txt')
if documento != "":
archivo_guardar = open(documento,"w",encoding="utf-8")
linea=""
for c in str(self.display.get('1.0',END)):
linea=linea+c
archivo_guardar.write(linea)
archivo_guardar.close()
messagebox.showinfo("GUARDADO","INFORMACIÓN GUARDADA EN \'{}\'".format(documento))
def abrir(self):
ruta = filedialog.askopenfilename(initialdir="/",title="SELECCIONAR ARCHIVO",
filetypes =(("png files","*.png") ,("jpg files","*.jpg")))
if ruta != "":
archivo = cv2.imread(ruta)
self.info = decode(archivo)
if self.info != []:
self.display.delete('1.0',END)
for i in self.info:
self.display.insert(END,(i[0].decode('utf-8'))+'\n')
else:
messagebox.showwarning("ARCHIVO NO VÁLIDO","NO SE DETECTÓ CÓDIGO QR.")
def screen_shot(self):
pyautogui.screenshot("QRsearch_screenshoot.jpg")
archivo = cv2.imread("QRsearch_screenshoot.jpg")
self.info = decode(archivo)
if self.info != []:
self.display.delete('1.0',END)
for i in self.info:
self.display.insert(END,(i[0].decode('utf-8'))+'\n')
else:
messagebox.showwarning("QR NO ENCONTRADO","NO SE DETECTÓ CÓDIGO")
os.remove("QRsearch_screenshoot.jpg")
def visor(self):
ret, frame=self.get_frame()
if ret:
self.photo = ImageTk.PhotoImage(image=Image.fromarray(frame))
self.canvas.create_image(0,0,image=self.photo,anchor=NW)
self.ventana.after(15,self.visor)
def active_cam(self):
if self.active_camera == False:
self.active_camera = True
self.VideoCaptura()
self.visor()
else:
self.active_camera = False
self.codelist = []
self.btnCamera.configure(text="INICIAR LECTURA POR CAMARA")
self.vid.release()
self.canvas.delete('all')
self.canvas.configure(height=0)
def capta(self,frm):
self.info = decode(frm)
cv2.putText(frm, "Muestre el codigo delante de la camara para su lectura", (84, 37), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
if self.info != []:
self.display.delete('1.0',END)
for code in self.info:
if code not in self.codelist:
content = code[0].decode('utf-8')
self.codelist.append(content)
self.display.insert(END,content+'\n')
self.draw_rectangle(frm)
else:
if len(self.codelist)>0:
self.display.delete('1.0',END)
for e in set(self.codelist):
self.display.insert(END,e+'\n')
def get_frame(self):
if self.vid.isOpened():
verif,frame=self.vid.read()
if verif:
self.btnCamera.configure(text="CERRAR CAMARA")
self.capta(frame)
return(verif,cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
else:
messagebox.showwarning("CAMARA NO DISPONIBLE","""La cámara está siendo utilizada por otra aplicación.
Cierrela e intentelo de nuevo.""")
self.active_cam()
return(verif,None)
else:
verif=False
return(verif,None)
def draw_rectangle(self,frm):
codes = decode(frm)
for code in codes:
data = code.data.decode('ascii')
x, y, w, h = code.rect.left, code.rect.top, \
code.rect.width, code.rect.height
cv2.rectangle(frm, (x,y),(x+w, y+h),(255, 0, 0), 6)
cv2.putText(frm, code.type, (x - 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 50, 255), 2)
def VideoCaptura(self):
self.vid = cv2.VideoCapture(self.font_video)
if self.vid.isOpened():
self.width=self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
self.height=self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
self.canvas.configure(width=self.width,height=self.height)
else:
messagebox.showwarning("CAMARA NO DISPONIBLE","El dispositivo está desactivado o no disponible")
self.display.delete('1.0',END)
self.active_camera = False
def __del__(self):
if self.active_camera == True:
self.vid.release()
if __name__=="__main__":
App()