<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416777&amp;view=findpost&amp;p=3820694</guid>
        <pubDate>Sat, 08 Feb 2020 16:54:52 +0000</pubDate>
        <title>Сканер штрих-кодов на OpenCV и Python</title>
        <link>https://forum.sources.ru/index.php?showtopic=416777&amp;view=findpost&amp;p=3820694</link>
        <description><![CDATA[amk: EAN (UPC) содержит информацию:<br>- код страны где товар произведён. Если не ошибаюсь, это цифра, зашифрованная выбором штрихов в правой части и первая цифра, зашифрованная непосредственно штрихами (в UPC (США) есть только вторая, коды 01-09 принадлежат США и Канаде);<br>- предприятии, произведшем товар, это пять оставшихся цифр в левой части кода. Чтобы их распознать нужна база данных кодов предприятий. Возможно, эту таблицу можно приобрести в организации, распределяющей коды. В каждой стране отдельно. И наверняка, за большие деньги.<br>- внутренний номер товара предприятия это пять цифр в правой части. Здесь соответствующая база данных является внутренним делом предприятия, и искать её придётся на каждом предприятии отдельно.<br>Про контрольную сумму ты и сам знаешь. Как, наверняка, и про описанную только что структуру.<br><br>Даже теоретически приобрести аутентичные базы данных мало реально. Кроме того, номера товаров, снятых с производства, похоже могут использоваться повторно - база данных будет устаревать.<br><br>Магазинам хватает того, что эти коды уникальны для товаров. В свою базу данных они эти товары заносят по мере поступления - пришёл товар, провели по нему считывателем. Если такой товар есть в БД - проверили, что код не переприсвоили. Если нет - внесли. <br><br>Возможно, существует какое-то сообщество, занимающееся сбором информации о товарах и их EAN, скорее всего, у них база данных бесплатная, но в ней только то, что попало в поле зрения.<br><br>Да, ещё одно. Если код страны 02, то это код, присвоенный товару торговой точкой. Это коды, не имеющие EAN на упаковке, и товары, продаваемые на развес (тогда код содержит ещё и вес товара).]]></description>
        <author>amk</author>
        <category>Python</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416777&amp;view=findpost&amp;p=3820675</guid>
        <pubDate>Sat, 08 Feb 2020 11:17:53 +0000</pubDate>
        <title>Сканер штрих-кодов на OpenCV и Python</title>
        <link>https://forum.sources.ru/index.php?showtopic=416777&amp;view=findpost&amp;p=3820675</link>
        <description><![CDATA[iVovan1996: Попробовал код отсюда:<br>
<a class='tag-url' href='https://pysource.com/2019/02/28/scanning-qr-code-opencv-with-python/' target='_blank'>https://pysource.com/2019/02/28/scanning-qr...cv-with-python/</a><br>
Он даже вывел данные, но у меня остался тот же самый вопрос - как на их основе получить информацию о человеке, товаре или организации? Если это чек или товар, где взять базу данных магазинов и товаров или как и к какому серверу подключиться, чтобы вывести информацию о магазине и времени покупки, а также название товара, его стоимость и изготовителя? Если это визитка человека или организации - где взять базы данных известных личностей и организаций России и США или как подключиться к серверам с этими базами? Где взять файл barcode.csv из модулей argparse, datetime, imutils, time и cv2? В инструкциях написано:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">.vscode/opencv-tmp/barcodes.csv</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Но это для линуксов. Где искать папку opencv-tmp в Anaconda-2019 и PyCharm Community?<br>
<br>
Исходный код:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">import cv2</div><div class="code_line">import numpy as np</div><div class="code_line">import pyzbar.pyzbar as pyzbar</div><div class="code_line">&nbsp;</div><div class="code_line">cap = cv2.VideoCapture(0)</div><div class="code_line">font = cv2.FONT_HERSHEY_PLAIN</div><div class="code_line">&nbsp;</div><div class="code_line">while True:</div><div class="code_line">&nbsp;&nbsp; &nbsp;_, frame = cap.read()</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;decodedObjects = pyzbar.decode(frame)</div><div class="code_line">&nbsp;&nbsp; &nbsp;for obj in decodedObjects:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;print(&quot;Data&quot;, obj.data)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cv2.putText(frame, str(obj.data), (50, 50), font, 2,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(255, 0, 0), 3)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cv2.imshow(&quot;Frame&quot;, frame)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;key = cv2.waitKey(1)</div><div class="code_line">&nbsp;&nbsp; &nbsp;if key == 27:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break</div></ol></div></div></div></div><br>
<br>
Результат:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">D:\Python\python.exe C:/barcode_scaner/barcode_scaner.py</div><div class="code_line">Data b&#39;t=20200201T1743&amp;s=100.00&amp;fn=9284000100199295&amp;i=143660&amp;fp=1698079161&amp;n=1&#39;</div><div class="code_line">Data b&#39;t=20200201T1743&amp;s=100.00&amp;fn=9284000100199295&amp;i=143660&amp;fp=1698079161&amp;n=1&#39;</div><div class="code_line">Data b&#39;t=20200201T1743&amp;s=100.00&amp;fn=9284000100199295&amp;i=143660&amp;fp=1698079161&amp;n=1&#39;</div><div class="code_line">Data b&#39;t=20200201T1743&amp;s=100.00&amp;fn=9284000100199295&amp;i=143660&amp;fp=1698079161&amp;n=1&#39;</div></ol></div></div></div></div><br>
<br>
Изображение смотрите по этой ссылке:<br>
<a class='tag-url' href='http://www.cyberforum.ru/attachments/1110814d1581157633' target='_blank'>Результат работы программы</a>]]></description>
        <author>iVovan1996</author>
        <category>Python</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416777&amp;view=findpost&amp;p=3820660</guid>
        <pubDate>Fri, 07 Feb 2020 21:11:25 +0000</pubDate>
        <title>Сканер штрих-кодов на OpenCV и Python</title>
        <link>https://forum.sources.ru/index.php?showtopic=416777&amp;view=findpost&amp;p=3820660</link>
        <description><![CDATA[amk: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416777&view=findpost&p=3820651'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>iVovan1996 &#064; <time class="tag-quote__quoted-time" datetime="2020-02-07T18:30:33+00:00">07.02.20, 18:30</time></span><div class='quote '>И в-четвёртых, как в Python включить русскую раскладку наподобии сишной функции setlocale из &lt;locale.h&gt;, чтобы компилятор не вывел вместо кириллицы вопросительные знаки?</div></div> Питон работает с UNICODE. Он должен нормально выводить кириллицу, если она есть в шрифтах. Попробуй вывести свою строку русского текста, записанную непосредственно в программе.<br>
 <br>
А вообще, в Python есть модуль locale, и в нём, представьте себе, есть функция setlocale.<br>
Модуль напрямую использует библиотеку работы с локалями ANSI C.]]></description>
        <author>amk</author>
        <category>Python</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416777&amp;view=findpost&amp;p=3820651</guid>
        <pubDate>Fri, 07 Feb 2020 18:30:33 +0000</pubDate>
        <title>Сканер штрих-кодов на OpenCV и Python</title>
        <link>https://forum.sources.ru/index.php?showtopic=416777&amp;view=findpost&amp;p=3820651</link>
        <description><![CDATA[iVovan1996: Добрый вечер, форумчане&#33; Я пишу сканер штрих-кодов по инструкциям на этом сайте:<br>
<a class='tag-url' href='https://habr.com/ru/company/enterra/blog/244163/' target='_blank'>https://habr.com/ru/company/enterra/blog/244163/</a><br>
Я работаю с OpenCV 4.1.2, Python 3.7, Anaconda 2019 и PyCharm Community. В процессе реализации алгоритма я столкнулся с некоторыми проблемами.<br>
Во-первых, подмодуль cv и константа CV_32F, которые используются в методе Собеля, были удалены в OpenCV 3.0. Я попробовал без подмодуля cv и получил ошибки, связанные с параметром --image. При этом пробная картинка лежит в папке с проектом, и путь к ней прописан. Какие аналоги есть у параметра --image и константы CV_32F в OpenCV 4.1.2 и Python 3.7?<br>
<br>
Исходный код:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line"># import the necessary packages</div><div class="code_line">import numpy as np</div><div class="code_line">import argparse</div><div class="code_line">import cv2</div><div class="code_line">&nbsp;</div><div class="code_line"># construct the argument parse and parse the arguments</div><div class="code_line">ap = argparse.ArgumentParser()</div><div class="code_line">ap.add_argument(&quot;-i&quot;, &quot;--image&quot;, required=True, help=&quot;5aa4dce1a6fd417e8b9df368d6c93842.jpg&quot;)</div><div class="code_line">args = vars(ap.parse_args())</div><div class="code_line">&nbsp;</div><div class="code_line"># load the image and convert it to grayscale</div><div class="code_line">image = cv2.imread(args[&quot;image&quot;])</div><div class="code_line">gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)</div><div class="code_line">&nbsp;</div><div class="code_line"># compute the Scharr gradient magnitude representation of the images</div><div class="code_line"># in both the x and y direction</div><div class="code_line">gradX = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)</div><div class="code_line">gradY = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=-1)</div><div class="code_line">&nbsp;</div><div class="code_line"># subtract the y-gradient from the x-gradient</div><div class="code_line">gradient = cv2.subtract(gradX, gradY)</div><div class="code_line">gradient = cv2.convertScaleAbs(gradient)</div><div class="code_line">&nbsp;</div><div class="code_line"># blur and threshold the image</div><div class="code_line">blurred = cv2.blur(gradient, (9, 9))</div><div class="code_line">(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)</div><div class="code_line">&nbsp;</div><div class="code_line"># construct a closing kernel and apply it to the thresholded image</div><div class="code_line">kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))</div><div class="code_line">closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)</div><div class="code_line">&nbsp;</div><div class="code_line"># perform a series of erosions and dilations</div><div class="code_line">closed = cv2.erode(closed, None, iterations = 4)</div><div class="code_line">closed = cv2.dilate(closed, None, iterations = 4)</div><div class="code_line">&nbsp;</div><div class="code_line"># find the contours in the thresholded image, then sort the contours</div><div class="code_line"># by their area, keeping only the largest one</div><div class="code_line">(cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cv2.CHAIN_APPROX_SIMPLE)</div><div class="code_line">c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]</div><div class="code_line">&nbsp;</div><div class="code_line"># compute the rotated bounding box of the largest contour</div><div class="code_line">rect = cv2.minAreaRect(c)</div><div class="code_line">box = np.int0(cv2.cv.BoxPoints(rect))</div><div class="code_line">&nbsp;</div><div class="code_line"># draw a bounding box arounded the detected barcode and display the</div><div class="code_line"># image</div><div class="code_line">cv2.drawContours(image, [box], -1, (0, 255, 0), 3)</div><div class="code_line">cv2.imshow(&quot;Image&quot;, image)</div><div class="code_line">cv2.waitKey(0)</div></ol></div></div></div></div><br>
<br>
Ошибки:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">D:\Python\python.exe C:/barcode_scaner/barcode_scaner.py</div><div class="code_line">usage: barcode_scaner.py [-h] -i IMAGE</div><div class="code_line">barcode_scaner.py: error: the following arguments are required: -i/--image</div><div class="code_line">&nbsp;</div><div class="code_line">Process finished with exit code 2</div></ol></div></div></div></div><br>
<br>
Во-вторых, я хочу по цифрам на штрих-коде определить и вывести на экран информацию о товаре - его название, производителя, магазин и время его покупки, как в Едадиле. Самостоятельно я могу только создать в MySQL таблицу кодов разных стран, по таблице найти нужный код и вывести страну приобретения, а также проверить товар на подлинность, сверив хеш-сумму с последней цифрой. Где искать актуальные базы данных со штрих-кодами товаров на этот месяц и год, чтобы по ним вывести информацию о магазине, изготовителе, время покупки и название? С помощью каких библиотек и функций можно её прочитать в Python? Как подключиться к серверу Universe-HTT, чтобы отправить запрос с цифрами штрих-кода, а потом с помощью JSON считать данные о стране, названии, производителе и времени покупки?<br>
<br>
Изображения смотрите по этим ссылкам:<br>
<a class='tag-url' href='http://www.cyberforum.ru/attachments/1110656d1581086073' target='_blank'>Тестовое изображение</a><br>
<a class='tag-url' href='http://www.cyberforum.ru/attachments/1110655d1581086073' target='_blank'>Папка с проектом</a> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-02-07T18:32:34+00:00">07.02.20, 18:32</time></span></span><br>
В-третьих, как определить область штрих-кода? Ведь я не знаю начальные координаты x0 и y0, известны только градиенты gradX и gradY, в которых лежит разность начальной и конечной координат. Я хочу обрезать картинку по области штрих-кода по иксу от x0 плюс/минус 1,5 до (x0 + gradX) плюс/минус 1,5 и точно также по игреку, создать отдельный файл, в котором пропишу функцию по извлечению и склейке цифрового кода, например, как здесь:<br>
<a class='tag-url' href='https://www.severcart.ru/blog/all/tesseract_ocr_python/' target='_blank'>https://www.severcart.ru/blog/all/tesseract_ocr_python/</a><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">from PIL import Image</div><div class="code_line">import pytesseract</div><div class="code_line">import cv2</div><div class="code_line">import os</div><div class="code_line">&nbsp;</div><div class="code_line">image = &#39;/tmp/tests.png&#39;</div><div class="code_line">&nbsp;</div><div class="code_line">preprocess = &quot;thresh&quot;</div><div class="code_line">&nbsp;</div><div class="code_line"># загрузить образ и преобразовать его в оттенки серого</div><div class="code_line">image = cv2.imread(image)</div><div class="code_line">gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)</div><div class="code_line">&nbsp;</div><div class="code_line"># проверьте, следует ли применять пороговое значение для предварительной обработки изображения</div><div class="code_line">&nbsp;</div><div class="code_line">if preprocess == &quot;thresh&quot;:</div><div class="code_line">&nbsp;&nbsp; &nbsp;gray = cv2.threshold(gray, 0, 255,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]</div><div class="code_line">&nbsp;</div><div class="code_line"># если нужно медианное размытие, чтобы удалить шум</div><div class="code_line">elif preprocess == &quot;blur&quot;:</div><div class="code_line">&nbsp;&nbsp; &nbsp;gray = cv2.medianBlur(gray, 3)</div><div class="code_line">&nbsp;</div><div class="code_line"># сохраним временную картинку в оттенках серого, чтобы можно было применить к ней OCR</div><div class="code_line">&nbsp;</div><div class="code_line">filename = &quot;{}.png&quot;.format(os.getpid())</div><div class="code_line">cv2.imwrite(filename, gray)</div><div class="code_line">&nbsp;</div><div class="code_line"># загрузка изображения в виде объекта image Pillow, применение OCR, а затем удаление временного файла</div><div class="code_line">text = pytesseract.image_to_string(Image.open(filename))</div><div class="code_line">os.remove(filename)</div><div class="code_line">print(text)</div><div class="code_line">&nbsp;</div><div class="code_line"># показать выходные изображения</div><div class="code_line">cv2.imshow(&quot;Image&quot;, image)</div><div class="code_line">cv2.imshow(&quot;Output&quot;, gray)</div><div class="code_line">input(‘pause…’)</div></ol></div></div></div></div><br>
<br>
А потом подключить этот файл к основному и оттуда вызвать функцию по определению цифр, в которую передам обрезанную картинку по области штрих-кода. Как узнать координаты области штрих-кода плюс/минус 1,5, чтобы правильно обрезать картинку, а потом считать и склеить цифры под штрих-кодом с помощью библиотеки pytesseract?<br>
<br>
И в-четвёртых, как в Python включить русскую раскладку наподобии сишной функции setlocale из &lt;locale.h&gt;, чтобы компилятор не вывел вместо кириллицы вопросительные знаки?]]></description>
        <author>iVovan1996</author>
        <category>Python</category>
      </item>
	
      </channel>
      </rss>
	