распознавание bar-кодов

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 03 окт 2018, 13:14

Olej писал(а): По мотивам, но не только это...
- Распознавалка QR-кодов (повёрнутых, искажённых перспективой и т.д.), которая позволяет не только распознать QR, но и детерминировать искажение:
Многочисленные эксперименты показали очень приличное (неожиданное даже) распознавание QR кодов и восстановление их искажённой позиции (поворот, перспектива, зашумленность изображения...).
Ключевым здесь является вызов:

Код: Выделить всё

barcodes = pyzbar.decode( image )
Где barcodes - это list of :obj:`Decoded`.

Код: Выделить всё

Decoded(data, type, rect, polygon)

data - это данные зашитые в QR

Код: Выделить всё

print( type( barcode.data ) )
или даже так:

Код: Выделить всё

# 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, но и окружения его). Это самый интересный параметр!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 03 окт 2018, 19:57

Olej писал(а):Многочисленные эксперименты
Для этого нужно генерировать (и распознавать в обратку) множество вариантов QR-кодов ... в частности, с возможностью туда зашивать произвольную информацию: а). русскоязычный текст в UTF-8, б). возможно, как вариант, бинарные данные.

Делать это можно разнообразными пакетами Python...
(и ещё есть разнообразие альтернатив для Python 2 и Python 3)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 03 окт 2018, 20:23

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 03 окт 2018, 20:29

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                                                                                                            

Выполнено!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 03 окт 2018, 20:36

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()

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 03 окт 2018, 20:39

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
Вложения
genqr1.py
(2.21 КБ) 79 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 03 окт 2018, 20:44

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 код, в который зашился этот текст:
Вложения
g1-1.png
g1-1.png (6.33 КБ) 2350 просмотров

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 03 окт 2018, 21:02

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.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 04 окт 2018, 13:22

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!
(это уникальный случай - я никогда такого не видел в отношении ни одного пакета репозитория!)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: распознавание bar-кодов

Непрочитанное сообщение Olej » 04 окт 2018, 15:07

Olej писал(а): Это означает, что Google поместили, в своё время, пакет в общий репозиторий Python, даже не проверив его использование в чём-то кроме Windows!
(это уникальный случай - я никогда такого не видел в отношении ни одного пакета репозитория!)
Но этот пакет:
1. можно взять текстуально из архивов Google pyqrnative - default ... Google отнесли его уже в архивы, проект не развивается, последние изменения - февраль 2016г.
2. поместить из скачанного файл PyQRNative.py в рабочий каталог...
3. лучше, в одном месте (в строке 967) поменять в Python 3 совместимый синтаксис:

Код: Выделить всё

print( "get ", val )

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 )
...
(в прикреплении - такой подготовленный файл)
Вложения
PyQRNative.py
(27.25 КБ) 76 скачиваний

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей