Начнем с описания пакетов, которые нам понадобиться
import cv2 import numpy as np import serial
cv2 — OpenCV библиотека компьютерного зрения. Берет на себя всю нагрузку по вводу и форматированию изображения.
numpy — библиотека для работы с массивами. Без нее OpenCV работать не будет.
serial — библиотека для работы с com-порт ПК.
ser = serial.Serial('COM5', 9600, write_timeout=1, timeout=0.1)
Инициализация библиотеки со скоростью 9600 бод/сек.
frame1 = cv2.imread('ars2.jpg')
Функция, которая загружает изображение с жесткого диска.
height = frame1.shape[0]//(frame1.shape[1]//432) frame1 = cv2.resize(frame1, (432,height), interpolation = cv2.INTER_AREA)
Функция изменения изображения по заданным размерам.
grayscaled1 = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY) ret,thresh1 = cv2.threshold(grayscaled1,127,255,cv2.THRESH_BINARY) img_bin = thresh1/255
Первая строка делает изображение черно-белым. Вторая делает бинаризацию. Бинаризация — суть в том что бы превратить картинку в массив где каждый пиксель будет иметь значение 1 или 0. Касса не уметь делать оттенки черного, поэтому нужна такая обработка. В этой функции все пиксели со значением меньше 127 будут 0, больше 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
Этот код превращает каждую строку в набор байтов. Т.е. берет первые восемь пикселей из строки и превращает их в байт. Затем берет следующие 8 из этой же строки и превращает их в байт.
while i: while u!=1: u = ser.write( b'P') u=0 ff=ser.read(1) if ff==b'B': i=0
Начало передачи. Если ответ не получен то не запуститься.
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
Отправка строки с проверкой закончилась ли картинка.
if h==2: low=low+54 h=0
Одна маленькая особенность. Если изображения отправить на печать как оно есть, то высота изображения уменьшится в два раза. Это связано с шагом двигателя. Конечно можно и делать два шага за раз, но тогда изображение будут тусклым.
while i: ff = ser.read(1) #print(ff) if ff==b'D': i=0
Ждем букву Д для синхронизации. Это означает что аппарат напечатал строку и готов к получению данных.
Ссылка на исходники github.com/beetlea/shtrih-m-fr-k
Ну и вот вам видосики. К сожалению самого видоса с печатью Киану не сохранилось.
ссылка на оригинал статьи https://habr.com/ru/post/466397/
Добавить комментарий