Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/98: Рейтинг темы: голосов - 98, средняя оценка - 4.52
5 / 5 / 3
Регистрация: 14.02.2013
Сообщений: 232

Распознание QR Код Zbar.pas

25.05.2013, 15:16. Показов 20548. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Кто нибудь подключал этот класс ZBar.rar к проекту? Если подключали поделитесь опытом. Что у кого получилось из этого... Или как подключить его чтоб распознать QR с картинки (или с web камеры).
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.05.2013, 15:16
Ответы с готовыми решениями:

В файле 1.PAS дана строка символов. Записать в файл 2.PAS строку, полученную из исходной по следующему правилу: заменить все вхождения подстроки ‘123
В файле 1.PAS дана строка символов. Записать в файл 2.PAS строку, полученную из исходной по следующему правилу: заменить все вхождения...

Библиотека ZBar Code Reader: сканирование и распознание QR-кода с вебкамеры ноутбука
Здравствуйте, пишу дипломный проект , на C#, необходимо реализовать сканирование и распознание QR-кода с вебкамеры ноутбука. Что...

Считать штрих-код при помощи библиотеки ZBar bar code reader
Есть библ "ZBar bar code reader". Есть желание извлечь штрих-код с картинки. Не знаю как завести стандартный пример с Magick++.h, т.к. не...

42
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
28.04.2015, 20:41
Студворк — интернет-сервис помощи студентам
Cогласен с вышесказанным. С тех пор тоже перешел на прямую работу с либой:
Кликните здесь для просмотра всего текста
и добавил помимо прочего и поддержку классических сканнеров

(6 минута 50 сек по распознаванию QR/BAR с WEB-ки)


p.s.: как время то летит, три года прошло с момента создания учебного приложения.
1
0 / 0 / 1
Регистрация: 10.04.2015
Сообщений: 10
30.04.2015, 14:59
Снова возвращаюсь к теме.
Видимо я немного поспешил, поскольку выложенная мною здесь функция не смогла декодировать QR-код с камеры. С тестовыми примерами справлялась, в отличие от прототипа с www.delphipraxis.net, почему и пришлось ее переделывать. Как выяснилось, причина заключалась в том, что тестовые изображения были в черно-белых тонах, а видео - в цвете. Соответственно, пришлось переделывать под цветочные изображения.
Окончательный вид процедуры:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
uses
  ZBar;
 
type
  TZbarSymbolTypes = set of zbar_symbol_type_e;
 
var
  CodStr: TStrings;
 
procedure ReadBarcode(Codes: TStrings; Source: TGraphic; AddBarType: Boolean = False);
var
  p: PByte;
  bmp: TBitmap;
  count, i, j: Integer;
  ba, pa: array of Byte;
  symboltype: zbar_symbol_type_t;
  scanner: zbar_image_scanner_t;
  stype: zbar_symbol_type_e;
  symbol: zbar_symbol_t;
  image: zbar_image_t;
  blob: PByte;
begin
  bmp := TBitmap.Create;
  bmp.PixelFormat := pf24bit; //pf8bit;
  try
    bmp.Width := Source.Width;
    bmp.Height := Source.Height;
    bmp.Canvas.Draw(0, 0, Source);
    if bmp.Width = 0 then Exit;
    Codes.Clear;
 
    scanner := zbar_image_scanner_create;
    try
      i := zbar_image_scanner_set_config(scanner, ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
      image := zbar_image_create;
      try
        blob := GetMemory((bmp.Height)*(bmp.Width));
        PByte(ba) := blob;
        for i := 0 to bmp.Height - 1 do begin
          p := bmp.ScanLine[i];  PByte(pa) := p;
          if bmp.PixelFormat = pf8bit then CopyMemory(@ba[i*bmp.Width], p, bmp.Width)
          else for j := 0 to bmp.Width - 1 do
            ba[j+i*bmp.Width] := Round(pa[j*3]*0.3 + pa[j*3+1]*0.59 + pa[j*3+2]*0.11);
        end;
        zbar_image_set_format(image, 'Y800');
        zbar_image_set_size(image, bmp.Width, bmp.Height);
        zbar_image_set_data(image, blob, bmp.Height * bmp.Width, nil);
 
        count := zbar_scan_image(scanner, image);
 
        if count > 0 then begin
          symbol := zbar_image_first_symbol(image);
          while Assigned(symbol) do begin
            symboltype := zbar_symbol_get_type(symbol);
            if AddBarType then
              Codes.Add(String(AnsiString(zbar_get_symbol_name(symboltype)) + AnsiString(zbar_get_addon_name(symboltype)))
                + '=' + String(AnsiString(zbar_symbol_get_data(symbol))))
            else
              Codes.Add(String(AnsiString(zbar_symbol_get_data(symbol))));
 
            symbol := zbar_symbol_next(symbol);
          end;
        end;
      finally
        PByte(pa) := nil;
        zbar_image_destroy(image);
      end;
    finally
      zbar_image_scanner_destroy(scanner);
    end;
  finally
    bmp.Free;
  end;
end;
Чтобы работать с черно-белыми изображениями нужно изменить 24 строчку, установив значение pf8bit.

Ну и выкладываю чуть исправленный мною ZBar.pas, адаптированный под младшие версии Delphi (D6-D7). В прошлый раз в спешке и путанице выложил оригинал.
Вложения
Тип файла: rar ZBar.rar (11.6 Кб, 137 просмотров)
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
30.04.2015, 22:46
...проще все преобразовывать в оттенки серого:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure Grayscale2(pBuf: pInteger; Count: integer);
var
  Color: integer;
begin;
  repeat;
    Color:=pBuf^;
    pBuf^:=(( Color * (150 * 256)
           + (Color and $00FF00FF) * (29 * 256 * 256 - 150 * 256 + 77)
            ) shr 24
           ) * $00010101;
    dec(Count);
    inc(pBuf);
    until Count<=0;
  end;
 
procedure ShaBitmapToGrayscale2(Bitmap: TBitmap);
var
  p, q: pInteger;
begin;
  with Bitmap do begin;
    p:=ScanLine[Height-1];
    q:=ScanLine[0];
    if cardinal(p)>cardinal(q) then p:=q;
    Grayscale2(p, Height * Width);
    end;
  end;
Добавлено через 7 часов 38 минут
...кстати, вот это:
Delphi
1
(String(AnsiString(
лишнее. И саму строку еще перекодировать utf8toansi(), ибо будут крякозябры на русском тексте в QR.
0
3 / 3 / 0
Регистрация: 17.11.2015
Сообщений: 8
17.11.2015, 13:49
Спасибо, огромное Tavr!

Код 100% рабочий, только добавил utf8toansi() - а то и впрямь - кракозябры.
Всё взлетело на XE8 без проблем.
Огромная благодарность и респект - вы меня очень выручили!
0
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 3
22.11.2015, 13:16
Как использовать эту процедуру (ReadBarcode), для проекта в Delphi7, не могу связать с кнопкой выбора изображения для сканирования и последующим выводом прочтённой информации с qr кода на экран.
0
3 / 3 / 0
Регистрация: 17.11.2015
Сообщений: 8
22.11.2015, 13:29
Странный вопрос. Источник изображения - Source: TGraphic. Source можете грузить из файла, можете - с видеокамеры (придется отдельно разбираться с DirectDraw). А выводить - в TMemo например: TMemo.Lines.Text := Codes.Text.

Всё просто и понятно. Если вы, конечно разбираетесь хоть немного в программировании на Delphi ))
0
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 3
27.11.2015, 17:38
Не получается у меня...Если я правильно понял "Source можете грузить из файла", через openDialog пробовал, не смог понять как влепить процедуру распознавания (мне с камеры не нужно, нужно просто с выбранного изображения). А вывод в memo соответственно тоже не получился + там надо будет добавить utf8toansi() это как я думаю. Я не силён, если можно, помогите...
0
3 / 3 / 0
Регистрация: 17.11.2015
Сообщений: 8
27.11.2015, 18:07
Выкладываю свой пример на XE8. Пример рабочий, правда форма кривовата - делал наспех просто чтоб проверить.
Вложения
Тип файла: zip ZBar.zip (735.2 Кб, 119 просмотров)
1
3 / 3 / 0
Регистрация: 17.11.2015
Сообщений: 8
27.11.2015, 18:10
Загрузка в TGraphic из файла: procedure LoadFromFile(const Filename: string). http://docwiki.embarcadero.com... adFromFile
1
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 3
04.12.2015, 16:52
Огромное спасибо, всё получилось. Но остались вопросы, по некоторым процедурам (они представлены ниже). У меня и без них нормально распознаёт qr-code с выбранного изображения. Вот, что мне потребовалось добавить
Delphi
1
2
3
4
5
6
7
procedure TForm1.ScanImageButtonClick(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
ReadBarcode(memo1.Lines, image1.Picture.Graphic, True);
 
end;
А вот это мне не понятно...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure Grayscale2(pBuf: pInteger; Count: integer);
var
  Color: integer;
begin;
  repeat;
    Color:=pBuf^;
    pBuf^:=(( Color * (150 * 256)
           + (Color and $00FF00FF) * (29 * 256 * 256 - 150 * 256 + 77)
            ) shr 24
           ) * $00010101;
    dec(Count);
    inc(pBuf);
    until Count<=0;
  end;
 
procedure ShaBitmapToGrayscale2(Bitmap: TBitmap);
var
  p, q: pInteger;
begin;
  with Bitmap do begin;
    p:=ScanLine[Height-1];
    q:=ScanLine[0];
    if cardinal(p)>cardinal(q) then p:=q;
    Grayscale2(p, Height * Width);
    end;
  end;
И процедуры из вашей программы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.btnDisableClick(Sender: TObject);
begin
  FImageScanner.Free;
end;
 
procedure TForm1.btnEnableClick(Sender: TObject);
var
  Res: integer;
  Major, Minor: cardinal;
begin
  Res := zbar_version(Major, Minor);
 
  FImageScanner := TImageScanner.Create;
end;
0
3 / 3 / 0
Регистрация: 17.11.2015
Сообщений: 8
04.12.2015, 17:52
Это лишний код просто. Остался от экспериментов. Забейте )
1
 Аватар для Pavlyukoff
0 / 0 / 0
Регистрация: 06.12.2015
Сообщений: 5
13.12.2015, 17:30
Направьте пожалуйста в нужную сторону.
Прочитал ветку и понял одно - БЕЗ ДОПОЛНИТЕЛЬНЫХ DLL оно работать не умеет.
Мне нужно сделать так, чтобы весь код был в одной DLL (пишу нативную компоненту для 1С8 - там нет возможности подключать дополнительные DLL в вёб-клиенте).
Может на CBuilder есть или под VC примеры использования исходников ZBAR без сторонних DLL ?
0
3 / 3 / 0
Регистрация: 17.11.2015
Сообщений: 8
13.12.2015, 17:44
Красиво жить не запретишь )). Я б тоже хотел обойтись без длл! Но из бесплатного есть в исходниках только это:
https://github.com/Spelt/ZXing.Delphi

Но оно распознает только Code 128, Code 93, QR-Code пока. Автор проекта приглашает присоединиться всех желающих и помочь портировать код с Java на Delphi... Вэлкам!
0
 Аватар для Pavlyukoff
0 / 0 / 0
Регистрация: 06.12.2015
Сообщений: 5
19.12.2015, 02:46
Ещё попрошу помощи.
Делфи7, файл и код и сообщений выше.
Простой проект - добавил на форму картинку, в неё загрузил тестовое изображение.
Кнопка и мемо.
Нажимаю кнопку - класс - распознан код.
Но вот незадача - при повторном нажатии (точнее быть на 4-й раз) стабильно вылетает.
Вылетает на
bmp.Free;

Добавлено через 32 минуты
Разобрался с вылетами.
после
Code
1
PByte(pa) := nil;
надо добавить
Code
1
PByte(ba) := nil;
0
0 / 0 / 0
Регистрация: 12.01.2016
Сообщений: 3
13.01.2016, 00:09
Добрый вечер всем.
Тут часто приводятся следующие сслыки, но они уже не работают.
Кто знает где можно взять или может выложить - поделитесь пожалуйста.

Сами исходники к этой публикации нашлись здесь (ссылка).
0
 Аватар для Briolin
59 / 64 / 11
Регистрация: 13.11.2014
Сообщений: 940
13.01.2016, 08:18
fastx, присоединяюсь к вопросу!
1
3 / 3 / 0
Регистрация: 17.11.2015
Сообщений: 8
13.01.2016, 08:52
Так а в чем проблема? Там используется известная библиотека ZBar, обсуждаемая здесь. И рабочие (100%) исходники здесь использующие ZBar есть.
Если ссылки умерли - чем вам форумчане смогут помочь?

Добавлено через 6 минут
Скриншот с web-камеры - отдельная задача. Это работа с DirectShow. Тут гугл вам поможет - примеров масса.
Например: http://basicsprog.ucoz.ru/publ/6-1-0-28
0
0 / 0 / 0
Регистрация: 12.01.2016
Сообщений: 3
13.01.2016, 18:11
stoi, я расчитывал что в публикациях более подробна расписана теоритическая часть (как работать с DirectShow, какие вызовы zbar за что отвечают). По исходникам мне чаще удаётся получить более-менее работающий пример, чем понять что действительно происходит. Поэтому, если имеется описание решения не в виде исходников, то я хотел бы с ним ознакомится. Но это, конечно, кому как.

В идеале хотелось бы иметь функциональность, аналогичную zbarcam - чтобы в приложении было видно что получился кадр с которого возможно распознать код и что код успешно распознался. Если рассматривать вариант со скриншотом от камеры - тут нужно получить кадр, где код будет виден отчетливо. Или как в исходниках - делать по таймеру скриншот и затем пытаться распознать код на нем, если не получилось - то снова сделать скриншот т.д (по крайнеё меретак я понял логику работы).
0
 Аватар для Briolin
59 / 64 / 11
Регистрация: 13.11.2014
Сообщений: 940
13.01.2016, 19:18
stoi, здесь в основном теория. Я хочу увидеть как это всё работает на практике. Вроде "разработки из жизни".Т.е. истории прогера который работал с этими всеми библиотеками обсуждаемыми тут, и как он с ними работал

Добавлено через 2 минуты
Цитата Сообщение от Pavlyukoff Посмотреть сообщение
надо добавить
CodeВыделить код
1
PByte(ba) := nil;
А почему именно добавить нужно было ba а не pa?
0
3 / 3 / 0
Регистрация: 17.11.2015
Сообщений: 8
13.01.2016, 19:19
у меня есть рабочий код распознавания и работы с DirecShow. Первый - выкладывал здесь. Второй - легко найти в инете. Я не вижу проблем. Зачем вам истории, когда есть MSDN? Или вы хотите чтоб вам всё разжевали и в рот положили? Но это же неинтересно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.01.2016, 19:19
Помогаю со студенческими работами здесь

Ошибка: [dcc32 Error] Unit1.pas(150): E2029 '(' expected but '[' found и [dcc32 Error] Unit1.pas(188): E2035 N
2 таких ошибки повторяются в нескольких местах. Код совсем сухой и еще совсем не доделан. Но на данном этапе в чем трабл?! unit Unit1; ...

Распознание
Есть несколько призвольных фигур (кривых) и одна эталонная(шаблон), все они заданы векторами. Мне нужно придумать алгоритм сравнения...

Распознание кода
typedef signed char aalSBool; const aalSBool AAL_SFALSE(-1); long SND_SPELL_SLOW_DOWN_END(AAL_SFALSE); SND_SPELL_SLOW_DOWN_END =...

Распознание элемента
Допустим у меня в форме есть grid, в нем находятся, допустим, 3 элемента: кнопка, текстбокс и лэйбл. Как сделать так, чтобы при нажатии на...

Распознание текста
Есть строка 110001001010. Нужно по символьно проверит ee. И если совпадение с вариантом из map заменить на ключ. Например элемент mар ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru