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

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

25.05.2013, 15:16. Показов 20928. Ответов 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
10237 / 6615 / 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
10237 / 6615 / 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
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru