OpenCV написан на C++. Если вы установите библиотеку OpenCV в Windows, вы увидите, что OpenCV официально предоставляет оболочки для Python и Java, но не для C#. К счастью, существует множество проектов .NET с открытым исходным кодом для обертывания API-интерфейсов OpenCV C++, поэтому нам не нужно писать оболочку с нуля. В этом посте я расскажу, как использовать библиотеку OpenCV и Dynamsoft Barcode Reader SDK для создания приложения для чтения штрих-кодов .NET в Windows.
Предпосылки
- Визуальная студия 2015
- ОпенКвШарп
- Считыватель штрих-кодов Dynamsoft
Считыватель штрих-кодов .NET с OpenCV
Я попробовал разные проекты с открытым исходным кодом и, наконец, решил использовать OpenCvSharp, который постоянно поддерживается сообществом открытого исходного кода.
Установите OpenCvSharp и Dynamsoft Barcode Reader через диспетчер пакетов в Visual Studio. Инструменты › Диспетчер пакетов NuGet › Консоль диспетчера пакетов:
PM > Install-Package OpenCvSharp3-AnyCPUPM> Install-Package Dynamsoft.DotNet.Barcode
Создайте объект захвата видео:
VideoCapture capture = new VideoCapture(0);
Получить кадр видео:
Mat image = capture.RetrieveMat();
Визуализируйте кадр в окне:
Cv2.ImShow("video", image);
Разорвите бесконечный цикл при нажатии клавиши «ESC»:
intkey = Cv2.WaitKey(20);// 'ESC'if(key == 27){break;}
Создайте объект считывателя штрих-кода:
BarcodeReader reader = new BarcodeReader("t0068MgAAALLyUZ5pborJ8XVc3efbf4XdSvDAVUonA4Z3/FiYqz1MOHaUJD3d/uBmEtXVCn9fw9WIlNw6sRT/DepkdvVW4fs=");
Для распознавания штрих-кодов вы можете использовать функцию DecodeBuffer(). Однако тип первого параметра — byte[]. Теперь самая большая проблема заключается в том, как заставить функцию работать с типом Mat.
Получите указатель данных, ширину, высоту и размер элемента следующим образом:
IntPtr data = image.Data;intwidth = image.Width;intheight = image.Height;intelemSize = image.ElemSize();intbuffer_size = width * height * elemSize;
Скопируйте данные в массив байтов:
usingSystem.Runtime.InteropServices;byte[] buffer = newbyte[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 inresults){Console.WriteLine(result.BarcodeText);}}
Соберите и запустите программу:
Ссылки на API
- https://shimat.github.io/opencvsharp_docs/index.html
- https://www.dynamsoft.com/help/Barcode-Reader/index.html
Исходный код
https://github.com/dynamsoft-dbr/opencv-dotnet
Первоначально опубликовано на www.codepool.biz 5 февраля 2018 г.