Страница 2 из 3
Re: распознавание bar-кодов
Добавлено: 03 окт 2018, 13:14
Olej
Olej писал(а):
По мотивам, но не только это...
- Распознавалка QR-кодов (повёрнутых, искажённых перспективой и т.д.), которая позволяет не только распознать QR, но и детерминировать искажение:
Многочисленные эксперименты показали очень приличное (неожиданное даже) распознавание QR кодов и восстановление их искажённой позиции (поворот, перспектива, зашумленность изображения...).
Ключевым здесь является вызов:
Где barcodes - это
list of :obj:`Decoded`.
data - это данные зашитые в QR
или даже так:
Код: Выделить всё
# the barcode data is a bytes object so if we want to draw it on
# our output image we need to convert it to a string first
barcodeData = barcode.data.decode("utf-8")
type - тип баркода
Код: Выделить всё
if barcode.type != 'QRCODE': continue # only QR codes
- polygon - 4-угольник обнаруженного QR-кода, но при деформациях изображения (поворот, перспектива) он становится 4-угольником общего положения (не квадрат) и по координатам его вершин можно восстановить деформацию
всего изображения (не только QR, но и окружения его). Это самый интересный параметр!
Re: распознавание bar-кодов
Добавлено: 03 окт 2018, 19:57
Olej
Olej писал(а):Многочисленные эксперименты
Для этого нужно
генерировать (и распознавать в обратку) множество вариантов QR-кодов ... в частности, с возможностью туда зашивать произвольную информацию: а). русскоязычный текст в UTF-8, б). возможно, как вариант, бинарные данные.
Делать это можно разнообразными пакетами Python...
(и ещё есть разнообразие альтернатив для Python 2 и Python 3)
Re: распознавание bar-кодов
Добавлено: 03 окт 2018, 20:23
Olej
Olej писал(а):Делать это можно разнообразными пакетами Python...
(и ещё есть разнообразие альтернатив для Python 2 и Python 3)
1-й из таких - пакет
qrtools.
Почитать коротко можно здесь:
Reading and Generating QR codes in Python using QRtools.
Но прежде, чем вы получите возможность использовать qrtools, вы ещё напоретесь на множество нужных доустановок, которые автоматом и по зависимостям не станут!
Поэтому конспектирую доведение до ума генератора QR через qrtools:
1.
Код: Выделить всё
[olej@dell Authentific]$ sudo pip install qrtools
[sudo] пароль для olej:
Collecting qrtools
Downloading https://files.pythonhosted.org/packages/c3/f8/0e6da677d31f55100bba8301f07aca2adea6d8b7b3d8e2286604c1a59b5c/qrtools-0.0.2.tar.gz
Installing collected packages: qrtools
Running setup.py install for qrtools ... done
Successfully installed qrtools-0.0.2
Но вы тут же напарываетесь на такую ошибку:
Код: Выделить всё
File "genqr1.py", line 10, in <module>
from qrtools import QR
File "/usr/lib/python2.7/site-packages/qrtools/__init__.py", line 4, in <module>
from qrtools.qrtools import *
File "/usr/lib/python2.7/site-packages/qrtools/qrtools.py", line 28, in <module>
import zbar
ImportError: No module named zbar
2.
Код: Выделить всё
[olej@dell QRgenerator]$ sudo pip install zbar
[sudo] пароль для olej:
Collecting zbar
Using cached https://files.pythonhosted.org/packages/33/54/cc5819efc9ee7e34b60b41e1d2d4753b6dd0c26a41c9a552611f66aa106e/zbar-0.10.tar.bz2
Installing collected packages: zbar
Running setup.py install for zbar ... error
Complete output from command /usr/bin/python2 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-qzxXGU/zbar/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-X9i0e4/install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_ext
building 'zbar' extension
creating build
creating build/temp.linux-x86_64-2.7
gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/python2.7 -c zbarmodule.c -o build/temp.linux-x86_64-2.7/zbarmodule.o
In file included from zbarmodule.c:24:0:
zbarmodule.h:24:10: фатальная ошибка: Python.h: Нет такого файла или каталога
#include <Python.h>
^~~~~~~~~~
компиляция прервана.
error: command 'gcc' failed with exit status 1
Потому что для компиляции у вас должна быть установлена среда
разработки Python:
Код: Выделить всё
[olej@dell QRgenerator]$ sudo dnf install python2-devel
[sudo] пароль для olej:
Последняя проверка окончания срока действия метаданных: 0:03:39 назад, Ср 03 окт 2018 17:48:16.
Зависимости разрешены.
==========================================================================================================================================
Пакет Архитектура Версия Репозиторий Размер
==========================================================================================================================================
Установка:
python2-devel x86_64 2.7.15-3.fc27 updates 410 k
Установка зависимостей:
python2-rpm-macros noarch 3-26.fc27 updates 9.8 k
Результат транзакции
==========================================================================================================================================
Установка 2 Пакеты
Объем загрузки: 419 k
Объем изменений: 1.1 M
Продолжить? [д/Н]: y
Загрузка пакетов:
(1/2): python2-rpm-macros-3-26.fc27.noarch.rpm 58 kB/s | 9.8 kB 00:00
(2/2): python2-devel-2.7.15-3.fc27.x86_64.rpm 1.1 MB/s | 410 kB 00:00
------------------------------------------------------------------------------------------------------------------------------------------
Общий размер 286 kB/s | 419 kB 00:01
Проверка транзакции
Проверка транзакции успешно завершена.
Идет проверка транзакции
Тест транзакции проведен успешно
Выполнение транзакции
Подготовка : 1/1
Установка : python2-rpm-macros-3-26.fc27.noarch 1/2
Установка : python2-devel-2.7.15-3.fc27.x86_64 2/2
Проверка : python2-devel-2.7.15-3.fc27.x86_64 1/2
Проверка : python2-rpm-macros-3-26.fc27.noarch 2/2
Установлено:
python2-devel.x86_64 2.7.15-3.fc27 python2-rpm-macros.noarch 3-26.fc27
Код: Выделить всё
[olej@dell QRgenerator]$ sudo pip install zbar-py
Collecting zbar-py
Using cached https://files.pythonhosted.org/packages/91/ba/5f16696d44c69df1d6a890adc60211183d2da90e8de4282d29d1475aba68/zbar-py-1.0.4.tar.gz
Requirement already satisfied: numpy in /usr/lib64/python2.7/site-packages (from zbar-py) (1.14.0)
Installing collected packages: zbar-py
Running setup.py install for zbar-py ... done
Successfully installed zbar-py-1.0.4
Re: распознавание bar-кодов
Добавлено: 03 окт 2018, 20:29
Olej
Olej писал(а):Olej писал(а):Делать это можно разнообразными пакетами Python...
Поэтому конспектирую доведение до ума генератора QR через qrtools:
3. Теперь вы получите трудно диагностируемую ошибку (описание которой я нигде не нашёл):
Код: Выделить всё
[olej@dell QRgenerator]$ python2 genqr1.py
{'output': None}
Traceback (most recent call last):
File "genqr1.py", line 42, in <module>
qr.encode() # encodes to a QR code
File "/usr/lib/python2.7/site-packages/qrtools/qrtools.py", line 152, in encode
self.data_to_string()
File "/usr/lib64/python2.7/subprocess.py", line 394, in __init__
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1047, in _execute_child
raise child_exception
OSError: [Errno 2] Нет такого файла или каталога
Выяснение показывает, что для работы метода QR.encode() вызывается внешняя программа (бинарная, ELF):
Код: Выделить всё
[olej@dell Authentific]$ which qrencode
/usr/bin/which: no qrencode in (/home/olej/.cargo/bin:/home/olej/.sdkman/candidates/kotlin/current/bin:/home/olej/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/olej/swift-4.0.3-RELEASE-ubuntu16.04/usr/bin:/home/olej/.cargo/bin:/home/olej/.local/bin:/home/olej/bin:/home/olej/swift-4.0.3-RELEASE-ubuntu16.04/usr/bin:/home/olej/.cargo/bin:/home/olej/swift-4.0.3-RELEASE-ubuntu16.04/usr/bin:/home/olej/.cargo/bin)
Код: Выделить всё
[olej@dell QRgenerator]$ sudo dnf install qrencode
Последняя проверка окончания срока действия метаданных: 0:08:03 назад, Ср 03 окт 2018 17:48:16.
Зависимости разрешены.
==========================================================================================================================================
Пакет Архитектура Версия Репозиторий Размер
==========================================================================================================================================
Установка:
qrencode x86_64 3.4.4-3.fc27 fedora 25 k
Результат транзакции
==========================================================================================================================================
Установка 1 Пакет
Объем загрузки: 25 k
Объем изменений: 33 k
Продолжить? [д/Н]: y
Загрузка пакетов:
qrencode-3.4.4-3.fc27.x86_64.rpm 27 kB/s | 25 kB 00:00
------------------------------------------------------------------------------------------------------------------------------------------
Общий размер 14 kB/s | 25 kB 00:01
Проверка транзакции
Проверка транзакции успешно завершена.
Идет проверка транзакции
Тест транзакции проведен успешно
Выполнение транзакции
Подготовка : 1/1
Установка : qrencode-3.4.4-3.fc27.x86_64 1/1
Запуск скриптлета: qrencode-3.4.4-3.fc27.x86_64 1/1
Running as unit: run-r1c4ac720fc724e62928b400835f1398e.service
Проверка : qrencode-3.4.4-3.fc27.x86_64 1/1
Установлено:
qrencode.x86_64 3.4.4-3.fc27
Выполнено!
Re: распознавание bar-кодов
Добавлено: 03 окт 2018, 20:36
Olej
Olej писал(а):
Делать это можно разнообразными пакетами Python...
(и ещё есть разнообразие альтернатив для Python 2 и Python 3)
4. Теперь, если у вас свежая система, и не устанавливали пакет компьютерного зрения (для рисования изображений ... хотя это можно делать и другими пакетами), то напоретесь на:
Код: Выделить всё
[olej@dell QRgenerator]$ python2 genqr1.py -s -v
Traceback (most recent call last):
File "genqr1.py", line 10, in <module>
import cv2
ImportError: No module named cv2
Добавляем:
Код: Выделить всё
[olej@dell 09]$ sudo python2 -m pip install opencv-python
[sudo] пароль для olej:
Collecting opencv-python
Downloading https://files.pythonhosted.org/packages/51/3d/9b10d7159e10ac87bd6c1b403dbc72b1240e18da51f9d56f50bb06f75d15/opencv_python-3.4.3.18-cp27-cp27mu-manylinux1_x86_64.whl (25.0MB)
100% |████████████████████████████████| 25.0MB 819kB/s
Requirement already satisfied: numpy>=1.11.1 in /usr/lib64/python2.7/site-packages (from opencv-python) (1.14.0)
Installing collected packages: opencv-python
Successfully installed opencv-python-3.4.3.18
Проверяем:
Код: Выделить всё
[olej@dell 09]$ python2
Python 2.7.15 (default, Sep 21 2018, 23:31:20)
[GCC 7.3.1 20180712 (Red Hat 7.3.1-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.4.3'
>>> quit()
Re: распознавание bar-кодов
Добавлено: 03 окт 2018, 20:39
Olej
Olej писал(а):
Делать это можно разнообразными пакетами Python...
(и ещё есть разнообразие альтернатив для Python 2 и Python 3)
Код: Выделить всё
И только теперь можете сгенерировать + посмотреть + записать в файл свой QR-код:
[olej@dell QRgenerator]$ python2 genqr1.py -s -v -o 1.png
get line (Enter for finishing): йцукен
<type 'unicode'>
text : йцукен
/tmp/qr-1538584634.502319/b0a7f3677512b34b7c61ffbe2ce791f714622d9be9c496e787615ce147423fe1.png
1.png
[olej@dell QRgenerator]$ ls -l *.png
-rw-rw-r-- 1 olej olej 290 окт 3 19:37 1.png.png
Вот мой код для этого:
Код: Выделить всё
# -*- coding: utf-8 -*-
import argparse
from qrtools import QR
import sys
import cv2
from commands import getoutput
ap = argparse.ArgumentParser() # construct the argument parse and parse the arguments
ap.add_argument( "-o", "--output", required = False, help = "path to the output image file" )
ap.add_argument( "-v", nargs='?', const=True, required=False, help = "increased verbose level" )
ap.add_argument( "-s", nargs='?', const=True, required=False, help = "single line" )
args = vars( ap.parse_args() )
#print( args )
debug = args[ "v" ] != None # verbose level
#print( sys.stdin.isatty() )
s = u''
if args[ "s" ] != None: # single line input
if sys.stdin.isatty():
sys.stdout.write( 'get line (Enter for finishing): ' )
sys.stdout.flush()
s = sys.stdin.readline()
if s[ len( s ) - 1 ] == '\n':
s = s[ :-1 ]
else: # multi line input
if sys.stdin.isatty():
print( 'Enter text (^D for finishing)' )
while True:
l = sys.stdin.readline()
if l == '': break # ^D - завершение ввода (EOF)
# s += l
s += l.decode( 'utf-8' )
#print( type( s ) )
#print( s )
#print( len( s ) )
text = s.decode( 'utf-8' ) # converte from 'str' to 'unicode'
if debug: print( type( text ) )
qr = QR( data = text, data_type = 'text' )
qr.encode() # encodes to a QR code
#print( qr.data_recognise() )
#print( qr.data )
#print( type( qr.data ) )
if debug: print( u'{} : {}'.format( qr.data_recognise(), qr.data ) )
if debug: print( qr.filename )
image = cv2.imread( qr.filename, cv2.IMREAD_LOAD_GDAL )
if image.ndim > 2:
image = cv2.cvtColor( image, cv2.COLOR_BGR2GRAY ) # convert image into grayscale
if None == args[ "output" ]:
getoutput( "mv " + qr.filename + " `pwd`" )
else:
print( args[ "output" ] )
getoutput( "mv " + qr.filename + " ./" + args[ "output" ] + ".png" )
cv2.imshow( '', image ) # show generated image
cv2.waitKey( 0 ) # wait for key pressed
Re: распознавание bar-кодов
Добавлено: 03 окт 2018, 20:44
Olej
Olej писал(а):
Вот мой код для этого:
Ним можно закатать в QR код не только одну строчку, но и многострочный текст (без опции -s - single strig) ... например, исходный код небольшой тестовой программы на Python (но так, чтобы её размер не вылез за предельный размер QR кода байтового формата - это UTF-8 - размер <= 2953 байт):
Код: Выделить всё
[olej@dell QRgenerator]$ cat bintest.py | python2 genqr1.py -v
<type 'unicode'>
text : # -*- coding: utf-8 -*-
import sys
#import argparse
#from PyQRNative import *
#import PyQRNative
mutable_bytes = bytearray( b'' )
for i in range( 0, 256 ):
mutable_bytes.append( i )
print( len( mutable_bytes ) )
for i in range( 0, 256 ):
sys.stdout.write( mutable_bytes[ i ] )
sys.exit()
/tmp/qr-1538585571.071063/6c8d1a59194dcffeb37ba97159f3aa56cc681dca04126657656492332678e4f1.png
И ниже - результирующий QR код, в который зашился этот текст:
Re: распознавание bar-кодов
Добавлено: 03 окт 2018, 21:02
Olej
Olej писал(а):
Делать это можно разнообразными пакетами Python...
(и ещё есть разнообразие альтернатив для Python 2 и Python 3)
Мне никакими силами не удалось заставить работать пакет qrtools с Python 3. Вываливается ошибка:
Код: Выделить всё
[olej@dell QRgenerator]$ python3 genqr1.py -s -v -o 1.png
Traceback (most recent call last):
File "genqr1.py", line 3, in <module>
from qrtools import QR
ImportError: cannot import name 'QR'
Даже после (казалось бы) успешной инсталляции пакета qrtools:
Код: Выделить всё
[olej@dell QRgenerator]$ sudo python3 -m pip install qrtools
Collecting qrtools
Using cached https://files.pythonhosted.org/packages/c3/f8/0e6da677d31f55100bba8301f07aca2adea6d8b7b3d8e2286604c1a59b5c/qrtools-0.0.2.tar.gz
Installing collected packages: qrtools
Running setup.py install for qrtools ... done
Successfully installed qrtools-0.0.2
И во всех
встреченных мной публикациях и примерах пакет qrtools используется
только с Python 2.
Re: распознавание bar-кодов
Добавлено: 04 окт 2018, 13:22
Olej
Olej писал(а):
1-й из таких - пакет qrtools.
2-й из таких пакетов -
PyQRNative, в своё время продвигаемый и популяризируемый Google.
Пример и почитать - здесь:
Создаём QR коды на Python (Перевод)
понедельник, 29 октября 2012 г.
В репозитории Python:
Код: Выделить всё
[olej@dell 09]$ python -m pip search PyQRNative
pyqrnative (0.1.4) - PyQRNative - generate QR codes in Python
Но:
Код: Выделить всё
[olej@dell 09]$ sudo python -m pip install PyQRNative
[sudo] пароль для olej:
Collecting PyQRNative
Downloading https://files.pythonhosted.org/packages/45/4b/01f689853f3fabe9de7ab155e6cd97cde960efce1c3df02c7322762164a9/pyqrnative-0.1.4.tar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-cudTQy/PyQRNative/setup.py", line 109, in <module>
setup_package()
File "/tmp/pip-install-cudTQy/PyQRNative/setup.py", line 92, in setup_package
write_version_py()
File "/tmp/pip-install-cudTQy/PyQRNative/setup.py", line 76, in write_version_py
a = open(filename, 'w')
IOError: [Errno 2] No such file or directory: 'pyqrnative/version.py'
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-cudTQy/PyQRNative/
И точно то же самое и в Python 2 и в Python 3 ...
Изучение (Интернет) показывает, что эта ошибка - у всех, известна, не исправляема...
https://code.google.com/archive/p/pyqrnative/issues/11
Unable to run setup.py (manually or via pip) on case-sensitive filesystems
Это означает, что Google поместили, в своё время, пакет в общий репозиторий Python,
даже не проверив его использование в чём-то кроме Windows!
(это уникальный случай - я никогда такого не видел в отношении ни одного пакета репозитория!)
Re: распознавание bar-кодов
Добавлено: 04 окт 2018, 15:07
Olej
Olej писал(а):
Это означает, что Google поместили, в своё время, пакет в общий репозиторий Python, даже не проверив его использование в чём-то кроме Windows!
(это уникальный случай - я никогда такого не видел в отношении ни одного пакета репозитория!)
Но этот пакет:
1. можно взять текстуально из архивов Google
pyqrnative - default ... Google отнесли его уже в архивы, проект не развивается, последние изменения - февраль 2016г.
2. поместить из скачанного файл PyQRNative.py в рабочий каталог...
3. лучше, в одном месте (в строке 967) поменять в Python 3 совместимый синтаксис:
4. проверяем:
Код: Выделить всё
[olej@dell QRgenerator]$ python3
Python 3.6.6 (default, Jul 19 2018, 16:29:00)
[GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import PyQRNative
>>> help( QRCode )
...
(в прикреплении - такой подготовленный файл)