Как SDK распознает штрих-коды в цветном изображении
В этом разделе
Цветное, палитровое или серое изображение (
цветное изображение) преобразуется в черно-белое изображение перед распознаванием штрих-кода.
Вот список шагов, который выполняется алгоритмом преобразования изображения:
-
Определить цветовой порог, который будет использован для разделения пикселов изображения на черные и белые
- Сумма компонентов цвета (T) рассчитывается для каждого пикселя по следующей формуле: T = R + G + B
-
Цвет пикселя меняется на черный, если T меньше значения цветового порога.
-
Цвет пикселя меняется на белый, если T больше или равно значению цветового порога.
Режим автоматического распознавания штрих-кодов
Этот режим позволяет максимально упростить процесс распознавания штрих-кодов. Вам нужно установить только ожидаемое количество штрих-кодов и значение интервала сканирования.
Режим автоматического распознавания предпочтителен, если вы считываете штрих-коды с изображений, порог которых сложно определить, а также когда штрих-коды повреждены из-за плохого качества исходного изображения (содержат шумы, искажения размеров, ...). В некоторых случаях этот режим снижает скорость распознавания штрих-кодов, так как дополнительные манипуляции с изображением, включенные в алгоритм автоматического распознавания, требуют дополнительного времени.
Определение цветового порога для распознавания штрих-кодов
Цветовой порог может быть:
- Расчитан автоматически (ThresholdMode = Vintasoft.Barcode.ThresholdMode.Automatic). Используется по умолчанию.
-
Задан вручную как одиночное значение (ThresholdMode = Vintasoft.Barcode.ThresholdMode.Manual).
SDK конвертирует цветное ищображение в черно-белое-изображение с помощью значения порога (свойство Vintasoft.Barcode.ReaderSettings.Threshold) и распознает штрих-коды в сконвертированном изображении.
-
Задан как диапазон пороговых значений (ThresholdMode = Vintasoft.Barcode.ThresholdMode.Iterations) с определенным шагом.
SDK конвертирует цветное изображение в N черно-белых изображений и распознает штрих-коды в сконвертированных изображениях. Количество итераций (N) определяется с помощью свойства Vintasoft.Barcode.ReaderSettings.ThresholdIterations, начальное значение диапазона пороговых значений определяется с помощью свойства Vintasoft.Barcode.ReaderSettings.ThresholdMin, начальное значение диапазона пороговых значений определяется с помощью свойства Vintasoft.Barcode.ReaderSettings.ThresholdMax. Процесс распознавания штрих-кодов будет прерван когда будет распознано количество штрих-кодов указанное с помощью свойства Vintasoft.Barcode.ReaderSettings.ExpectedBarcodes.
Следует использовать режим Vintasoft.Barcode.ThresholdMode.Automatic, если нужно распознать штрих-коды с множества разных изображений, например, изображения получены с разных устройств и в разных условиях освещения.
Следует использовать режим Vintasoft.Barcode.ThresholdMode.Manual, если нужно распознать штрих-коды с похожих изображений, например, используется порог, который дает лучший результат распознавания для коллекции штрих-кодов.
Следует использовать режим Vintasoft.Barcode.ThresholdMode.Iterations, если нужно распознать штрих-коды в изображениях, где трудно найти одно пороговое значение.
Пример: Вот пример, который показывает, как обнаруживать штрих-коды на цветном изображении в котором трудно определить цветовой порог.
/// <summary>
/// Reads barcodes from color image.
/// </summary>
/// <param name="filename">A path to an image file.</param>
/// <returns>A string with information about recognized barcodes.</returns>
public static string ReadBarcodesFromColorImage(string filename)
{
// create a BarcodeReader object
using (Vintasoft.Barcode.BarcodeReader barcodeReader = new Vintasoft.Barcode.BarcodeReader())
{
// specify that only Code 39, EAN, PDF417 and Micro PDF417 barcodes must be searched
barcodeReader.Settings.ScanBarcodeTypes =
Vintasoft.Barcode.BarcodeType.Code39 |
Vintasoft.Barcode.BarcodeType.EAN8 |
Vintasoft.Barcode.BarcodeType.EAN13 |
Vintasoft.Barcode.BarcodeType.PDF417 |
Vintasoft.Barcode.BarcodeType.MicroPDF417;
// specify that only image pixels of every 5 row and column must analyzed for barcode searching
barcodeReader.Settings.ScanInterval = 5;
// specify that barcode searching must be stopped when 10 barcodes are searched
barcodeReader.Settings.ExpectedBarcodes = 10;
// extract barcodes
Vintasoft.Barcode.IBarcodeInfo[] infos = barcodeReader.ReadBarcodes(filename);
// if barcodes are not detected
if (infos == null || infos.Length == 0)
return "Codes are not detected.";
// get information about extracted barcodes
System.Text.StringBuilder resultString = new System.Text.StringBuilder();
resultString.AppendLine(string.Format("Codes detected [{0}]:", infos.Length));
for (int i = 0; i < infos.Length; i++)
resultString.AppendLine(infos[i].ToString());
return resultString.ToString();
}
}
''' <summary>
''' Reads barcodes from color image.
''' </summary>
''' <param name="filename">A path to an image file.</param>
''' <returns>A string with information about recognized barcodes.</returns>
Public Shared Function ReadBarcodesFromColorImage(filename As String) As String
' create a BarcodeReader object
Using barcodeReader As New Vintasoft.Barcode.BarcodeReader()
' specify that only Code 39, EAN, PDF417 and Micro PDF417 barcodes must be searched
barcodeReader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Code39 Or Vintasoft.Barcode.BarcodeType.EAN8 Or Vintasoft.Barcode.BarcodeType.EAN13 Or Vintasoft.Barcode.BarcodeType.PDF417 Or Vintasoft.Barcode.BarcodeType.MicroPDF417
' specify that only image pixels of every 5 row and column must analyzed for barcode searching
barcodeReader.Settings.ScanInterval = 5
' specify that barcode searching must be stopped when 10 barcodes are searched
barcodeReader.Settings.ExpectedBarcodes = 10
' extract barcodes
Dim infos As Vintasoft.Barcode.IBarcodeInfo() = barcodeReader.ReadBarcodes(filename)
' if barcodes are not detected
If infos Is Nothing OrElse infos.Length = 0 Then
Return "Codes are not detected."
End If
' get information about extracted barcodes
Dim resultString As New System.Text.StringBuilder()
resultString.AppendLine(String.Format("Codes detected [{0}]:", infos.Length))
For i As Integer = 0 To infos.Length - 1
resultString.AppendLine(infos(i).ToString())
Next
Return resultString.ToString()
End Using
End Function