Перейти к содержимому
Compvision.ru
L@MER

USB3Vision+Genicam+OpenCV

Recommended Posts

Здравствуйте форумчане!

 

Планирую применить в своей разработке промышленные видеокамеры (JAI GO или BASLER асе) с интерфейсами USB3Vision со стандартом передачи данных GenIcam (см.вложенный PDF файл). Для данных видеокамер производитель предусматривает собственные SDK, так в инструкции для SDK JAI написано:

 

The JAI SDK consists of two APIs (Application Programming Interfaces):

1. Jai_Factory.dll: Windows DLL with “Plain” C-interface and C/C++ header file with all functions and parameter types defined. This makes it possible to use JAI SDK in almost any programming language available for the Windows platform.

 

2. Jai_FactoryDotNET.dll: Managed Windows DLL (.NET Framework 2.0). This DLL exposes the “Plain” function interface PLUS an “object-oriented” API. The object-oriented API encapsulates the “standard use” of the “plain” C-interface API.

 

Далее там-же описаны примеры интеграции в проекты, написанные на Microsoft Visual Studio 2005 C/C++, С# и т.п. (см.вложенный PDF файл).

 

В проекте своем планирую применить библиотеку OpenCV,  так как имею опыт работы с ней и данная библиотека меня всем устраивает. До этого с данной библиотекой создавал приложения, работающие со стандартными вебкамерами по интерфейсу USB2.0. Там все понятно. В данном случае же прошу консультации есть ли возможность подружить видеокамеры, описанные мною выше с OpenCV (связка USB3Vision+Genicam+OpenCV). Есть ли успешно реализованные проекты на основе OpenCV и USB3Vision+GenIcam? Какие возможны подводные камни при получении изображения в OpenCV с таких камер.

 

P.S. Не хотелось бы ошибиться и купить камеру, которую невозможно потом будет привязать к OpenCV, т.к.данные камеры не дешевые.

 

Заранее благодарен за внимание к теме!

JAI-SDK-Getting-Started-Guide_revK.pdf

genicam_basler.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, если через их API можно получить сырые данные с камеры, то в чем проблема руками конвертировать в понятный OpenCV формат? 

А вообще я с промышленными камерами сталкивался только в ethernet исполнении. Там оно подключалось через модуль camera_aravis для ROS. Камеры от basler/continental вроде как через него работают. Советую поискать по ROS'овскому стеку подходящий для вашего кейса модуль.

 

з.ы. а можно поинтересоваться, под какие задачи вы эти камеры собираетесь использовать? Это ведь сильно не бюджетный вариант, с ценниками от 500$...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

з.ы. а можно поинтересоваться, под какие задачи вы эти камеры собираетесь использовать? Это ведь сильно не бюджетный вариант, с ценниками от 500$...

 

Распознавание профиля изделий в тяжелой промышленности в процессе формовки. Там серьезные требования к применяемым камерам. Использоваться будут две камеры (каждая в районе 1000 евро) и генераторы лазерной линии для формирования изображения профиля.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати, раз зашел разговор о промышленных камерых. Может кто-нибудь посоветует камеру с низким разрешением (1.3Mp за глаза) но приличным качеством? А то все варианты, какие я встречал что у basler, что у continental идут с 5Mp, и переплачивать за неиспользуемое разрешение как-то не оченб хочется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати, раз зашел разговор о промышленных камерых. Может кто-нибудь посоветует камеру с низким разрешением (1.3Mp за глаза) но приличным качеством? А то все варианты, какие я встречал что у basler, что у continental идут с 5Mp, и переплачивать за неиспользуемое разрешение как-то не оченб хочется.

 

Вот например у BASLER: http://www.baslerweb.com/ru/produkty/matrichnye-kamery/ace/aca1300-30uc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В общем, прошла неделя консультаций и писем от поставщиков и интеграторов камер Basler и JAI. Результат - обе эти камеры (точнее их ПО) могут взаимодействовать с OpenCV. И там и там есть реализованные проекты с OpenCV. В программном пакете JAI SDK имеется три примера интеграции на C++. ПО Basler к тому-же поддерживает DirectShow.

 

В общем, может быть кому-нибуть данная веточка и информация пригодится.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как показала практика BASLER асе с интерфейсами USB3Vision прекрасно находится через VideoCapture cap(). А вот через CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY) нет. Это на заметку!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В проекте используются две камеры USB3.0. Обе висят на одном хост-контроллере на двух USB3.0 портах ноутбука.

 

Открываю видеопоток:

 

VideoCapture cap_1(1); // Открываем камеру (1)
VideoCapture cap_2(2); // Открываем камеру (2)

 

При этом в программе видно изображение только одной из камер.

Если вместо одной из USB3.0 камер подключаю USB2.0 камеру, то все хорошо - транслируется картинка и с USB3.0 и c USB2.0 камеры.

Вначале грешил, что при разрешении в 5МП хост USB3.0 не протягивает две камеры. Так нет, запускаю программу тестовую, что шла с USB3.0 камерами - две картинки с двух камер без тормозов на полном разрешении. Уменьшал разрешение камер - пофиг, через OpenCV все-равно  затык...видится только одна.

В каком направлении думать? Ощущение что OpenCV не нравится, что они на одном хосте сидят...походу придется внешний хост покупать....Или может у кого похожая ситуация была...кто как решал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Камеры открываются обе?

Я имею ввиду метод isOpen() что выдает?

 

Если открыты, можно попробовать по одному кадру с каждой по очереди тянуть попробовать (по нажатию кнопки).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нет, вторую камеру он не открывает вообще.

Открывает только VideoCapture cap_1(1).

VideoCapture cap_2(2) - не открывает.

При этом, провел эксперимент.

Подключил встроенную вебкамеру ноута, внешнюю вебкамеру USB2.0 и внешнюю камеру USB3.0 - все ОК.

 

VideoCapture cap_0(0) - встроенная камера ноута

VideoCapture cap_1(1) - USB2.0

VideoCapture cap_2(2) - USB3.0

 

Короче засада именно в параллельной работе USB3.0 камер, точнее в их открытии...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А ОС какая?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А ОС какая?

Windows 7 Professional 64 bit. Пробовал на двух ноутах. На обоих есть пара USB3.0. Та-же картина. USB2.0 камер хоть четыре работают. А из двух подключенных USB3.0 работает только одна. При этом средствами Basler SDK запускаю пару USB3.0 камер совместно на ура.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А посмотри какие dll подгружает Basler SDK, а какие твоя программа про проигрывании видео (можно с помощью ProcessExplorer от Руссиновича). Так можно узнать с помощью чего осуществляется захват с камеры. Ищется что-то типа dshowxxx.dll, но лучше выложи полные списки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А посмотри какие dll подгружает Basler SDK, а какие твоя программа про проигрывании видео (можно с помощью ProcessExplorer от Руссиновича). Так можно узнать с помощью чего осуществляется захват с камеры. Ищется что-то типа dshowxxx.dll, но лучше выложи полные списки.

 

Вот что подгружает Basler SDK:

 

Basler SDK.txt

 

Вот что подгружает моя прога на OpenCV:

 

OpenCV.txt

 

С ходу посмотрел, что и та и та программы подгружают одинаковые dll от Basler.

По dll от данного производителя различие только в двух компонентах, программа от Basler подгружает еще вот это:

 

PylonGUI_MD_VC100.dll    pylonGUI Module    Basler    C:\Program Files\Basler\pylon 4\pylon\bin\x64\PylonGUI_MD_VC100.dll

PylonUtility_MD_VC100.dll

 

Их вызов обеспечивается в начале Basler SDK:

// Include files to use the PYLON API.
#include <pylon/PylonIncludes.h>
#include <pylon/PylonGUI.h>
// Namespace for using pylon objects.
using namespace Pylon;

int main(int argc, char* argv[])
{
	CTlFactory& tlFactory = CTlFactory::GetInstance();
	// Get all attached devices and exit application if no device is found.
	DeviceInfoList_t devices;
	if (tlFactory.EnumerateDevices(devices) == 0)
	{
		throw RUNTIME_EXCEPTION("No camera present.");
	}
	// Create an instant camera object with the camera device 0.
	CInstantCamera camera_1(tlFactory.CreateDevice(devices[0]));
	CInstantCamera camera_2(tlFactory.CreateDevice(devices[1]));
	// Start the grabbing 
	camera_1.StartGrabbing();
	camera_2.StartGrabbing();
	// This smart pointer will receive the grab result data.
	CGrabResultPtr ptrGrabResult_1;
	CGrabResultPtr ptrGrabResult_2;
	while (1)
	{
		// Wait for an image and then retrieve it. A timeout of 5000 ms is used.
		camera_1.RetrieveResult(5000, ptrGrabResult_1, TimeoutHandling_ThrowException);
		camera_2.RetrieveResult(5000, ptrGrabResult_2, TimeoutHandling_ThrowException);
		// Display the grabbed image.
		Pylon::DisplayImage(1, ptrGrabResult_1);
		Pylon::DisplayImage(2, ptrGrabResult_2);
	}
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В общем, в процессе экспериментов выявлено, что средствами OpenCV одновременно открыть потоки с двух промышленных камер Basler USB3.0 не получается никакими танцами с бубном или без оного. Проблему решил совместив открытие потоков и захват при помощи Basler Pylon SDK (см.код выше) и дальнейшую обработку и вывод на форму средствами OpenCV. При этом открытие потоков и захват реализованы в одном потоке. Попытки вначале распаралелить открытие и захват на два потока привело к конфликтам и ошибкам. Совмещение в одном потоке обеспечило стабильную работу.

 

P.S. Как показала практика при захвате и обработка одного цветного изображений разрешением 2590х1940 13 fps средствами OpenCV отьедает приблизительно 120-130 Мб оперативной памяти. При захвате цветного изображения разрешением 2590х1940 13 fps средствами Basler SDK и обработке средствами OpenCV отъедает только 60-80 Мб оперативной памяти. Загрузка процессора Core i5 в обоих случаях составляет от 85-96%. При этом изображение на форме достаточно плавное. При включении фильтра Гаусса с одним изображением получаю тормоза, с двумя изображениями такого формата и разрешения на форме - супертормоза. Принял решение в дальнейшем перейти на mono8, благо задача позволяет и использовать ROI, т.к. усреднять ВСЕ изображение такого разрешения нецелесообразно с точки зрения использования ресурсов компьютера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

"Core i5 в обоих случаях составляет от 85-96%" что-то сильно много, у нас на full-hd 25fps с селеронами загрузка была на уроне 15%. Может у вас 85% это с учетом вывода изображения уже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте, форумчане.

 

Занимаюсь изучением интерфейса GenIсam. В связи с этим у меня имеется масса вопросов. Не могли бы Вы ответить на часть из них? Все мои вопросы находятся в прикреплённом файле.Question1_Forum.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×