OpenCV написан на C++. Если вы установите библиотеку OpenCV в Windows, вы увидите, что OpenCV официально предоставляет оболочки для Python и Java, но не для C#. К счастью, существует множество проектов .NET с открытым исходным кодом для обертывания API-интерфейсов OpenCV C++, поэтому нам не нужно писать оболочку с нуля. В этом посте я расскажу, как использовать библиотеку OpenCV и Dynamsoft Barcode Reader SDK для создания приложения для чтения штрих-кодов .NET в Windows.

Предпосылки

Считыватель штрих-кодов .NET с OpenCV

Я попробовал разные проекты с открытым исходным кодом и, наконец, решил использовать OpenCvSharp, который постоянно поддерживается сообществом открытого исходного кода.

Установите OpenCvSharp и Dynamsoft Barcode Reader через диспетчер пакетов в Visual Studio. Инструменты › Диспетчер пакетов NuGet › Консоль диспетчера пакетов:

PM > Install-Package OpenCvSharp3-AnyCPU
PM> Install-Package Dynamsoft.DotNet.Barcode

Создайте объект захвата видео:

VideoCapture capture = new VideoCapture(0);

Получить кадр видео:

Mat image = capture.RetrieveMat();

Визуализируйте кадр в окне:

Cv2.ImShow("video", image);

Разорвите бесконечный цикл при нажатии клавиши «ESC»:

int key = Cv2.WaitKey(20);
// 'ESC'
if (key == 27)
{
break;
}

Создайте объект считывателя штрих-кода:

BarcodeReader reader = new BarcodeReader("t0068MgAAALLyUZ5pborJ8XVc3efbf4XdSvDAVUonA4Z3/FiYqz1MOHaUJD3d/uBmEtXVCn9fw9WIlNw6sRT/DepkdvVW4fs=");

Для распознавания штрих-кодов вы можете использовать функцию DecodeBuffer(). Однако тип первого параметра — byte[]. Теперь самая большая проблема заключается в том, как заставить функцию работать с типом Mat.

Получите указатель данных, ширину, высоту и размер элемента следующим образом:

IntPtr data = image.Data;
int width = image.Width;
int height = image.Height;
int elemSize = image.ElemSize();
int buffer_size = width * height * elemSize;

Скопируйте данные в массив байтов:

using System.Runtime.InteropServices;
byte[] buffer = new byte[buffer_size];
Marshal.Copy(data, buffer, 0, buffer_size);

Декодируйте буфер и верните результаты штрих-кода:

BarcodeResult[] results = reader.DecodeBuffer(buffer, width, height, width * elemSize, ImagePixelFormat.IPF_RGB_888);
if (results != null)
{
Console.WriteLine("Total result count: " + results.Length);
foreach (BarcodeResult result in results)
{
Console.WriteLine(result.BarcodeText);
}
}

Соберите и запустите программу:

Ссылки на API

Исходный код

https://github.com/dynamsoft-dbr/opencv-dotnet

Первоначально опубликовано на www.codepool.biz 5 февраля 2018 г.