El rodaje de la venta libre en el teléfono con el reconocimiento posterior



Introducción h4> Se da la circunstancia de que vivo en una casa sin calefacción central, y por lo tanto cada calienta mi apartamento por su cuenta. Lo más a menudo utilizados para este fin las calderas de gas, el método es bastante barato, nada de que quejarse, pero hay una sutileza. Para el correcto funcionamiento de la caldera de gas (de repente), debe tener el gas en el tubo.

Tal vez porque no todos se comportan las calderas, pero nuestro desvío, aunque a corto plazo a la interrupción del suministro de gas y se enciende de nuevo si se restablece el suministro. Si alguien tiene una casa, no es un problema, presione el botón y la caldera se calienta más, pero si sucedió tan de repente que decidimos como una familia para ir de vacaciones, y el patio de invierno, tan bueno, tan -20 ° C, y luego las consecuencias podrían ser nefastas.

La solución es simple - dejar las llaves a familiares / amigos / vecinos, para que puedan venir y encender la caldera haya problemas. Bueno, si hay un vecino que vendría todos los días y comprobar si todo está en orden. Y si no? ¿O es que él también decide ir a algún lugar para el fin de semana?

Así que, decidí establecer la lectura del medidor laico algún lugar de Internet, por lo que he podido encontrar en cualquier lugar en un largo viaje para comprobar periódicamente si el gas se pierde, y si se detiene de repente el gasto, entonces corrí a llamar a familiares / amigos / vecinos (o cualquier persona allí dejado las llaves) para venir y hacer clic.

Por supuesto, después de poner algunos simples indicaciones internet decidí no parar allí y enturbiado más el reconocimiento de indicaciones y la representación gráfica de esta en la parte 2 de este tema.

Parte 1: Las lecturas del medidor y ponerlos en Internet h4> Es necesario mencionar que hay contadores en una naturaleza completamente diferente, algunos de ellos tienen neumáticos e interfaces especiales para la eliminación automática de pruebas. Si usted tiene esto, entonces el siguiente, probablemente no puede leer. Pero tengo una muy ordinaria sin dichas interfaces (por lo menos no he encontrado, puede, mal aspecto) modelo GALLUS iV PSC. Por lo tanto, sigue siendo una opción - Indicaciones visuales tasas de remoción. En las redes de ofrecer soluciones ya hechas, pero cuestan mucho dinero, y lo más importante, no es el deporte, por lo que vamos a hacer todo por sí mismos.

¿Qué necesitamos? H5> En las lecturas del medidor y luego enviar estas lecturas a Internet, necesitamos cualquier teléfono inteligente Android innecesaria. Por ejemplo, he utilizado para estos fines, el Samsung Galaxy S III (SCH-i535). Sí, probablemente, no todos los lectores ha revolcarse alrededor con la tercera galaxia, pero hay que entender que los requisitos para un teléfono inteligente no es tan grande:
  • se debe cargar
  • debería funcionar la cámara
  • debería funcionar WiFi
    Tener un hobby para comprar en ebay diferentes teléfonos rotos y coleccionismo de ellos trabajan, me encontré fácilmente en su placa base zagashnike de SGS3 micrófono inoperante (~ $ 10), y la cámara b / y shnuyu (~ $ 10) y una batería de Chino (~ 300r). También para la conveniencia de fijación de la batería a la placa usando un marco con pantalla rota.


    Inicialmente pensado para gestionar sólo la placa base y la cámara, pero resultó que, incluso cuando se conecta a las tarifas de carga no incluida sin baterías, así que tuve que añadir otro marco y la batería. Pero en este caso, el presupuesto era de alrededor de $ 30 si se utiliza las máquinas SGS3 más fácil, usted puede conseguir lejos y para una cantidad menor.

    Sin embargo, esta solución tiene sus inconvenientes, el teléfono inteligente sin una pantalla táctil, y no es tan conveniente para ajustar, por lo que hablar un poco sobre la forma en que era necesario para resolver este problema.

    Configuración del equipo h5> Partimos desde el peor de los casos. Asuma que no hay pantalla, sin pantalla táctil, smartphone no tener raíz, depuración adb está desactivada, el firmware es desconocido.

    Reanimación h6> Advertencia! B> Otras instrucciones apropiadas para el Samsung Galaxy S III (SCH-i535), si usted tiene otro teléfono inteligente, los pasos pueden ser diferentes.

    Se supone que está familiarizado con conceptos tales como ADB, firmware, etc ..

    Para llevar el teléfono inteligente en un conocido más o menos para nosotros la condición para iniciar el desagüe beg firmware VRBMB1 aquí usando Odin. No voy a describir en detalle cómo se hace esto, el Internet está lleno de instrucciones sobre cómo utilizar Odin ohmios. Odin en este caso es bueno que es fácil de trabajar sin necesidad de utilizar la pantalla del teléfono inteligente, sólo necesita convertir su smartphone en modo de descarga (Vol Abajo + Home + Power - mantenga unos segundos, entonces el Vol Up, conectados por USB a windsurf y todos los otros asuntos Odin-a).

    Después de Odín coser drenaje, teléfono de arranque del sistema, desconéctelo de la USB y retire la batería, por lo que se apaga. Esta operación se debe realizar cada vez que después de completar el firmware Odin-ohm para iniciar la siguiente operación con el estado apagado.

    Siguiente coser recuperación CWM y root en инструкции. En resumen, debido a que:
  • Después de Odín parpadee una costumbre butcheyn VRALEC.bootchain.tar.md5
Después de Odín cose la recuperación CWM Una recuperación CWM cosido SuperSU_Bootloader_FIXED.zip . El manual dice que usted necesita para lanzar una cremallera en la tarjeta SD, pero debido a la ausencia de la pantalla es más fácil hacerlo a través de carga lateral:
Gire el cuerpo de la celebración de la Vol Arriba + Home + Power - Mantenga unos segundos, y luego otros 5 segundos de carga, entrar en el modo de recuperación CWM-
. Marque esta escribiendo en la consola en ubuntu
  adb devices  code>  pre> (el propio cuerpo deben estar conectados por USB y se debe instalar adb - 
  sudo apt-get install android-tools-adb  code>  pre>): 
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ adb devices $ Lista de dispositivos conectados 64cb5c59 recuperación & lt; / código de & gt;  pre> Si usted ve la última línea, entonces todo está bien, haga clic en un dispositivo Vol Abajo, Vol Abajo, Power - cambia a carga lateral adb (al menos en la versión de las instrucciones CWM es la segunda línea desde la parte superior), sólo podemos escribir el ubuntu consola: 
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ SuperSU_Bootloader_FIXED.zip $ adb carga lateral envío: "carga lateral" 100% & lt; / código de & gt;  pre> y las moscas de la raíz en el dispositivo, después de lo cual no Recuerde apagar el dispositivo, retire las pilas.  
Después de Odín parpadee una butcheyn social correspondiente a la puesta en marcha de la VRBMB1_Bootchain.tar.md5 < / a>
 Lo siguiente que necesitamos para habilitar la depuración USB en el teléfono, este teléfono inteligente lanzamiento modo CWM de recuperación, compruebe:
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ adb devices Lista de dispositivos conectados 64cb5c59 recuperación & lt; / código de & gt;  pre> Monte sistema: 
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ adb shell mount -o rw -t ext4 /dev/block/platform/msm_sdcc.1/by-name/system / sistema & lt; / código & gt;  pre> para agregar las líneas en /system/build.prop: 
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ concha & quot $ adb; echo \ & quot; persist.service.adb.enable = 1 \ & quot; & Gt; & gt; /system/build.prop" & Lt; / código de & gt;  pre> Reboot: 
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ adb reboot & lt; / código de & gt;  pre> Estamos a la espera para la carga, comprobar el estado de la ADB terminal: 
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ adb dispositivos Lista de dispositivos conectados 64cb5c59 dispositivo & lt; / código de & gt;  pre> Bingo! La depuración es en, vamos a ver lo que tenemos pasando por el teléfono durante este plazo  utilizando Java Web Start y ver: 


Este simkarty activación pantalla de Verizon, no tiene una tarjeta SIM, así que voy a omitir la activación, que actúa sobre las instrucciones:

en la pantalla de selección de idioma tocar constantemente pantalla inferior esquina izquierda (por encima de la llamada de emergencia), la esquina inferior derecha, inferior izquierda, inferior derecha, y el volumen + blockquote> A saber:

 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ adb grifo de entrada de shell octubre 1150 maléfico @ lepeshka: ~ $ grifo de entrada adb shell 710 1150 maléfico @ lepeshka: ~ $ adb grifo de entrada de shell octubre 1150 maléfico @ lepeshka: $ entrada adb shell ~ toque 710 1150 & lt; / código & gt;  pre> A continuación, pulse el botón en el teléfono inteligente Vol arriba, ahora ver: 


Ponga una marca de verificación y haga clic en Aceptar:
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ toque $ entrada adb shell 50.600 maléfico @ lepeshka: ~ $ entrada adb shell toque 650 600 & lt; / código de & gt;  pre>  

Svaypaem para desbloquear la pantalla:
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: golpe ~ $ adb shell de entrada 100 100 500 100 & lt; / código de & gt;  pre>  

Ahora tiene que poner un poco de vnc-server para Android, por ejemplo, . Instálelo en su teléfono inteligente:
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ adb install droide + VNC + servidor + v1.1RC0.apk 4055 KB / s (2.084.419 bytes en 0.501s) pkg: / data / local /tmp/droid+VNC+server+v1.1RC0.apk Éxito & lt; / código de & gt;  pre> Nos despiertan teléfono inteligente, ya que es probable que caiga dormido hasta que nos instalamos vnc-server y svaypaem, que desbloquear la pantalla: 
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ entrada adb shell KeyEvent 26 maléfico @ lepeshka: ~ $ golpe de entrada adb shell 100 100 500 100 & lt; / código de & gt;  pre> vnc Ejecutar -server: 
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ adb shell am iniciar -a -n android.intent.action.Main org.onaips.vnc / .MainActivity & lt; / código de & gt;  pre>  

Haga clic en Aceptar:
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ entrada adb shell toque 50900 & lt; / código de & gt;  pre>  

Haga clic en Inicio:
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ entrada adb shell toque 350 300 & lt; / código de & gt;  pre>  

Haga clic para conceder acceso:
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ toque $ entrada adb shell 600 1000 & lt; / código de & gt;  pre>  

Ok, ahora son el reenvío a través de los puertos ADB:
 & lt; code class = & quot; golpe & quot; & gt; maléfico @ lepeshka: ~ $ adb tcp adelante: 5801 tcp: 5801 maléfico @ lepeshka: ~ $ adb tcp adelante: 5901 tcp: 5901 & lt; / código de & gt;  pre > e ir a través del navegador de su teléfono inteligente, o su cliente VNC favorito. 


Seguir trabajando como un teléfono Android convencional, sólo a través de un ordenador, es conveniente configurar la conexión WiFi, entonces podemos ir en VNC a través de WiFi, pero no todo el tiempo para mantener el teléfono conectado a la computadora (después de medidor de gas no siempre se encuentra en las cercanías de la computadora.)

Ahora, cuando la interacción con el dispositivo está plenamente establecida, se puede proceder a configurar las fotografía y la edición de datos en Internet.

Sacar una foto Periódica h6> instalar aplicaciones , créelo con el perfil temporal de las 00:00 hasta las 23:59 cada 30 minutos para llevar a cabo una acción - para hacer la foto. Opciones de disparo seleccionar el lugar más adecuado para el teléfono y el contador. Tengo esta macro con el flash obligatorio.

Eso es cierto, en realidad, puse mi teléfono (vista superior):


Caja de cartón atada con una cuerda a la barra, que es el hogar de un teléfono inteligente, el embalaje de los huevos allí para reparar su teléfono inteligente en una posición vertical. Entonces el diseño más refinado con cinta adhesiva y cartón para el flash no se anda directamente en la cara, le da una mirada seria, la prevención de reconocimiento. Por encima de todo la tapa cerrada para el interior estaba oscuro, o en la luz ambiental brillante no siempre es función de enfoque automático correctas.

En la configuración del smartphone en el revelador medios definitivamente debe poner una marca de verificación al smartphone no dormirse en la carga conectada, y luego en algún momento se detiene a fotografiar y sólo si continúa molestar.


para difundir en Internet h6> para mover las imágenes capturadas de la contrarrevolución en la Internet, he utilizado la primera aplicación disponible - . Es capaz de sincronizar una carpeta con una carpeta en su teléfono inteligente, como Google Drive.

Por lo tanto, puedo ahora desde cualquier parte del mundo donde haya acceso a Internet, vaya a Google Drive y verifique que la caldera de gas está funcionando normalmente.

Parte 2: Detección de indicaciones h4> Así que, después de enviar la lectura del medidor en la Internet, que se interesó en la posibilidad de un reconocimiento automático de los títulos. Esto permitirá:

para llevar a cabo un análisis estadístico del consumo de gas un seguimiento automático de la escasez de gas (con un aviso por e-mail o sms)
 Como lenguaje de desarrollo fue seleccionado pitón, para obtener imágenes de utilizar la biblioteca .

Aquí está el código del programa principal, que está dirigido por la corona una vez por hora:

 & lt; code class = & quot; pitón & quot; & gt; import sys os importación de modelos importar getImage, sess de getImagesFromGDrive importación GDrive, createImageFromGDriveObject if __name__ == '__main__': # obtener una lista de las nuevas fotos de imágenes de disco de Google, http = getImagesFromGDrive () # procesar alternativamente en un bucle para img_info en imágenes: # imágenes descarga img = createImageFromGDriveObject (img_info, http) nombre_archivo = img_info ['title'] # look para una entrada en la base de datos de prueba: dbimage = getImage (os.path.basename ( nombre_archivo)) dbimage.img = img dbimage.download_url = img_info [& quot; downloadURL & quot;] dbimage.img_link = img_info ['webContentLink'] reemplazar ('& amp; exportación = Descargar', ''), excepto ValueError como e:. Imprimir E continuar # reconoce los dbimage.identifyDigits indicación () # Guardar los datos en la base de datos sess.commit () & lt; / código & gt;  pre> Se utiliza el código de la función que voy a publicar a continuación: 

  getImagesFromGDrive  code>  pre> - una función que devuelve una lista de los que aún no reconocer las imágenes de Google Drive   
  createImageFromGDriveObject  code>  pre> - función, descargue la imagen en sí misma y la convierte en un formato OpenCV   
  getImage  code>  pre> - función busca un registro de las imágenes en la base de datos, si no, entonces crearlo   
  identifyDigits  code>  pre> - método reconociendo el testimonio de esta imagen   
  http  code>  pre> - cliente para acceder a Google Drive, los detalles sobre el acceso a la API de lectura de disco autorizado < a href = "https://developers.google.com/drive/web/quickstart/quickstart-python"> aquí 

  sess < / code>  pre> - el objeto de conexión a la base de datos utilizando la biblioteca  SQL Alquimia   
Trabajando con Google Drive h5> Lo primero que hacemos es obtener con Google Drive lista de imágenes:
 & lt; code class = & quot; pitón & quot; & gt; os de importación de tzinfo datetime importación, timedelta, fecha a partir de dateutil.relativedelta relativedelta importación de apiclient.discovery acumulación de importación de modelos de importación getLastRecognizedImage def getImagesFromGDrive (): # define carpeta Identificación Google disco en el que las imágenes se FOLDER_ID = '0B5mI3ROgk0mJcHJKTm95Ri1mbVU' # crea el objeto autorizado cliente http = getAuthorizedHttp () # servicio Disc objeto drive_service = acumulación ('unidad', 'v2', http = http) # Para iniciar elimina de la imagen de disco sobre todo mes, estamos ya no está interesado month_ago = date.today () + relativedelta (meses = -1) q = & quot; '% s' en los padres y mimeType = "image / jpeg" y destrozado = false y ModifiedDate & lt; '% s '& quot; .% (FOLDER_ID, month_ago.isoformat ()) = archivos drive_service.files () Lista (q = q, maxResults = 1000) .Execute () para una imagen en files.get ('artículos'): drive_service.files (). basura (fileid = imagen ['id']). execute () # Ahora hacer la consulta a la base de datos, devuelve la última imagen reconocida last_image = getLastRecognizedImage () # obtener una lista de imágenes de disco, la fecha de modificación es posterior a la fecha de grabación de la última reconocida PAGE_SIZE imagen = 1000 resultado = [] pt = Ninguno # desde la API de unidad no permite tiempo para llegar a más de 1.000 imágenes, # a continuación, descargar la página de lista por página para 1000 y añade un único array while True: q = & quot; '% s' en los padres y la papelera = falsa y mimeType = "image / jpeg" y ModifiedDate & gt; '% s' & quot; % (FOLDER_ID, last_image.check_time.replace (tzinfo = TZ ()). Isoformat ("T")) archivos drive_service.files = (). Lista (q = q, maxResults = PAGE_SIZE, pageToken = pt) .Execute () result.extend (files.get ('artículos')) pt = files.get ('nextPageToken') si no pt: Rotura lista # vuelco al tratamiento fue en el orden del tiempo de disparo result.reverse () return resultado, http & lt; / código de & gt;  pre> discos del cliente autorizados se crean de la siguiente manera: 
 & lt; code class = & quot; pitón & quot; & gt; importación ConfigParser httplib2 importación de OAuth2WebServerFlow oauth2client.client importación de oauth2client.file importación Almacenamiento def getAuthorizedHttp (): # obtenemos desde el archivo config.ini registrado allí CLIENT_ID y CLIENT_SECRET config = ConfigParser .ConfigParser () config.read ([os.path.dirname (__ __ archivo) + '/ config.ini']) CLIENT_ID = config.get ('GDrive', 'CLIENT_ID') CLIENT_SECRET = config.get ('GDrive', 'CLIENT_SECRET') # OAuth 2.0 alcance que se autorizó. # Compruebe https://developers.google.com/drive/scopes para todos los ámbitos disponibles. OAUTH_SCOPE = # 'https://www.googleapis.com/auth/drive' Redirigir URI para las aplicaciones instaladas REDIRECT_URI = "urn: IETF: WG: OAuth: 2.0: OOB 'archivo # client_secrets.json almacenará el token de almacenamiento = almacenamiento (os.path.dirname (__ FILE) + '/client_secrets.json') credenciales = storage.get () # si nada en el archivo, a continuación, ejecute el procedimiento de autorización si no credenciales: # Realizar flujo autorización OAuth2.0. flujo = OAuth2WebServerFlow (CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI) authorize_url = flow.step1_get_authorize_url () # de salida en el enlace de la consola, donde hay que ir para autorizar la impresión 'ir a la siguiente link en su navegador:' + authorize_url # solicita un código de respuesta = raw_input ('Introduzca el código de verificación:') .strip () = flow.step2_exchange credenciales (código) # guardar el storage.put ficha (credenciales) # crea el cliente http y se autoriza su http = httplib2.Http () credentials.authorize (http) http volver & lt; / código & gt;  pre> Para CLIENT_ID y CLIENT_SECRET necesitados  Google Desarrolladores Consola  para crear un proyecto, y por esta proyecto en  APIs y auth  -  Credenciales  -  OAuth  en  Crear nuevo ID CLIENTE , no seleccione  Instalado aplicación  -  Los demás 
 

La primera vez que ejecuta el script para escribir en la consola en la url que te quieres ir a conseguir una ficha, la inserta en su navegador, permitir que las aplicaciones accedan a Google Drive, copia emitida por el código de verificación de Google desde el navegador y dar la secuencia de comandos. A continuación, la secuencia de comandos se mantendrá todo lo que necesita en el archivo
  client_secrets.json  code>  pre> y carreras posteriores no pedirán nada. 

La función de descarga de imágenes es extremadamente simple:
 & lt; code class = & quot; pitón & quot; & gt; importación cv2 numpy importación como downloadImageFromGDrive def np (downloadURL, http = None): si http == None: http = getAuthorizedHttp () # imágenes descarga resp, contenido = http. solicitud (downloadURL) # Crear el objeto de imagen OpenCV img_array = np.asarray (bytearray (contenido), dtype = np.uint8) cv2.imdecode retorno (img_array, cv2.IMREAD_COLOR) def createImageFromGDriveObject (img_info, http = None): volver downloadImageFromGDrive ( img_info ['downloadURL'], http) & lt; / código de & gt;  pre> 
Búsqueda testimonio en la foto h5> Lo primero que debe hacer después de que nos dieron la foto, que se encuentra en él figura que reconocemos. Este método hace
  extractDigitsFromImage  code>  pre>: 
 & lt; code class = & quot; pitón & quot; & gt; def extractDigitsFromImage (auto): img = self.img & lt; / código de & gt;  pre> 
Originalmente la foto se parece a esto:


Así que primero nos dirigimos a ella adquirió la orientación deseada.
 & lt; code class = & quot; pitón & quot; & gt; # Se gira 90 grados h, w, k = img.shape M = cv2.getRotationMatrix2D ((w / 2, h / 2), 270, 1) img = cv2.warpAffine (img, M, (w, h)) & lt; / código de & gt;  pre> 


 & lt; code class = & quot; pitón & quot; & gt; # Recortar el campo negro que surgió después de la rotación img = img [0: h, (WH) / 2: h + (WH) / 2] h, w, k = img.shape & lt; / código de & gt;  pre> 



             
             







Tags

Vea también

Nueva y Notable