Jump to content
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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

В проекте используются две камеры 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 не нравится, что они на одном хосте сидят...походу придется внешний хост покупать....Или может у кого похожая ситуация была...кто как решал?

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

Открывает только 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 камер, точнее в их открытии...

Share this post


Link to post
Share on other sites

А ОС какая?

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

А посмотри какие 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);
	}
}

Share this post


Link to post
Share on other sites

В общем, в процессе экспериментов выявлено, что средствами 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, т.к. усреднять ВСЕ изображение такого разрешения нецелесообразно с точки зрения использования ресурсов компьютера.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×