Reprogramamos el cajero e imprimimos en él Keanu Reeves. Parte 2. Software para PC

En un artículo anterior, describí brevemente mi firmware para CTK SHTRIH-FR-K, que le permite controlar el cabezal térmico, los motores y, en consecuencia, imprimir cualquier cosa. En esta parte, mostraré cómo escribir software que se comunicará con el cajero y formateará la imagen para imprimir.

imagen

Comencemos describiendo los paquetes que necesitamos.

import cv2 import numpy as np import serial 

cv2 - Biblioteca de visión por computadora OpenCV. Se necesita toda la carga de ingresar y formatear la imagen.
numpy es una biblioteca para trabajar con matrices. OpenCV no funcionará sin él.
serial: biblioteca para trabajar con PC com-port.

 ser = serial.Serial('COM5', 9600, write_timeout=1, timeout=0.1) 

Inicialización de la biblioteca a 9600 bps.

 frame1 = cv2.imread('ars2.jpg') 

Una función que descarga una imagen desde un disco duro.

 height = frame1.shape[0]//(frame1.shape[1]//432) frame1 = cv2.resize(frame1, (432,height), interpolation = cv2.INTER_AREA) 

La función de cambiar la imagen a un tamaño determinado.

 grayscaled1 = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY) ret,thresh1 = cv2.threshold(grayscaled1,127,255,cv2.THRESH_BINARY) img_bin = thresh1/255 

La primera línea hace que la imagen sea en blanco y negro. El segundo hace binarización. Binarización: el resultado final es convertir una imagen en una matriz donde cada píxel tendrá un valor de 1 o 0. La caja registradora no se puede hacer en tonos de negro, por lo que este procesamiento es necesario. En esta función, todos los píxeles con un valor inferior a 127 serán 0, mayores que 1.

 for n in range(img_bin.shape[0]): for m in range(img_bin.shape[1]): #print(n,m) df=img_bin[n,m] if df==0: bb = bb+1*zz zz=zz*2 if zz==256: zz=1 print_img.append(bb) bb=0 

Este código convierte cada línea en un conjunto de bytes. Es decir toma los primeros ocho píxeles de una cadena y los convierte en bytes. Luego toma los siguientes 8 de la misma línea y los convierte en bytes.

  while i: while u!=1: u = ser.write( b'P') u=0 ff=ser.read(1) if ff==b'B': i=0 

Inicio de transferencia. Si no se recibe respuesta, no comience.

  i=54 while i: while u!=1: #u = ser.write(bytes([print_img[y]])) u = ser.write(bytes([print_img[y]])) #buf.append(print_img[y]) #print(bytes([print_img[y]])) y=y+1 if y == len(print_img): f=f-1 y=0 i=i-1 u=0 

Enviar una línea con un cheque para ver si la imagen ha terminado.

  if h==2: low=low+54 h=0 

Una pequeña característica. Si la imagen se envía para imprimir como está, la altura de la imagen se reducirá a la mitad. Esto se debe a la inclinación del motor. Por supuesto, puede hacer dos pasos a la vez, pero luego la imagen será tenue.

  while i: ff = ser.read(1) #print(ff) if ff==b'D': i=0 

Estamos esperando que la letra D se sincronice. Esto significa que la máquina ha impreso una línea y está lista para recibir datos.

Enlace a las fuentes github.com/beetlea/shtrih-m-fr-k

Bueno, aquí tienes el vidosiki. Desafortunadamente, los vidos mismos con el sello de Keanu no sobrevivieron.


Source: https://habr.com/ru/post/466397/


All Articles