OberonCore
https://forum.oberoncore.ru/

Vimba - API для видеокамер Allied Vision
https://forum.oberoncore.ru/viewtopic.php?f=47&t=5675
Страница 1 из 2

Автор:  Иван Денисов [ Вторник, 12 Апрель, 2016 08:49 ]
Заголовок сообщения:  Vimba - API для видеокамер Allied Vision

Заработала привязка к библиотеке VimbaC.dll.

Блэкбокс получил информацию о камере :)
Код:
API started
Vimba Version
Major: 1
Minor: 5
Patch: 0
 1
Camera Name:Manta
Model Name: Manta G-223B (E0022522)
Camera ID: DEV_000F314CC328
Serial Number: 50-0503347596
API shutdown


Как проверю всю привязку, то выложу тут как пример что получилось.

Автор:  prospero78 [ Вторник, 12 Апрель, 2016 10:44 ]
Заголовок сообщения:  Re: Константа для заголовка

Стесняюсь спросить.
Ваня, а это вообще что и зачем?

Автор:  Иван Денисов [ Вторник, 12 Апрель, 2016 18:05 ]
Заголовок сообщения:  Re: Константа для заголовка

prospero78 писал(а):
Стесняюсь спросить.
Ваня, а это вообще что и зачем?

Это камера к микроскопу идет. С нее надо снимать изображение и на лету обрабатывать. Данные мне удалось получить в Блэкбокс. Но к сожалению пока работает не стабильно. Сборщик мусора убивает Блэкбокс почему-то. Пока разбираюсь.

В библиотеке главная структура в которую принимается кадр с камеры выглядит так.
Код:
   Frame* = RECORD [untagged]
      buffer*:  ANYPTR; (* в оригинале был тип void* *)
      bufferSize*: INTEGER;
      context*: ARRAY [untagged] 4 OF ANYPTR;  (* в оригинале    void*  context[4];  *)
      receiveStatus*: FrameStatus;
      receiveFlags*: FrameFlags;
      imageSize*: INTEGER;
      ancillarySize*: INTEGER;
      pixelFormat*: VmbPixelFormat;
      width*: INTEGER;
      height*: INTEGER;
      offsetX*: INTEGER;
      offsetY*: INTEGER;
      frameID*: LONGINT;
      timestamp*: LONGINT;
   END;
   PtrFrame* = POINTER TO Frame;


Проскольку размер кадра может быть разный, то приходится буфер динамически выделять.
Код:
TYPE buf: POINTER [untagged] TO ARRAY OF SHORTCHAR;
...
NEW(buf, nPayloadSize);
frame.buffer := SYSTEM.VAL(ANYPTR, buf);


Стоит сборщику запустится, после того как изображение было взято, как Блэкбокс падает разными способами.
Статический массив не получается использовать, так как библиотека проверяет тип данных и отказывается другие структуры принимать.

Автор:  prospero78 [ Вторник, 12 Апрель, 2016 18:44 ]
Заголовок сообщения:  Re: Константа для заголовка

ХМ, У меня такое подозрение, что это нечто каждый раз по разным адресам снимок складывает.
Поэтому сборщик мусора и вешается. Не знает куда сунуться.
Очень подозрительные поля buffer и context.
Там где вижу void, там меня аж передёргивает.
Почему ты void приравниваешь ANYPTR? Это же вроде как совсем не кошерно?
Если положиться на здравый смысл, то buffer -- это адрес буфера (начало массива?) Поэтому тип в ББ имеет размер INTEGER (если 32 бита исходная шняга). context вообще на 4ый элемент массива ссылается. ОН ВООБЩЕ БЕЗТИПОВЫМ БЫТЬ НЕ МОЖЕТ!

Автор:  Alexander Shiryaev [ Вторник, 12 Апрель, 2016 19:55 ]
Заголовок сообщения:  Re: Константа для заголовка

Замени "buffer: ANYPTR" на "buffer: POINTER [untagged] TO ARRAY [untagged] OF SHORTCHAR"
Все массивы (ARRAY) и записи (RECORD) должны быть с [untagged]. Ну и POINTERs тоже.

context*: ARRAY [untagged] 4 OF ANYPTR; (* в оригинале void* context[4]; *)
=>
PtrVoid = POINTER [untagged] TO RECORD [untagged] END;
context*: ARRAY [untagged] 4 OF PtrVoid;

Цитата:
Поскольку размер кадра может быть разный, то приходится буфер динамически выделять.

Сделай статический максимальной длины, да и всё.

Автор:  prospero78 [ Вторник, 12 Апрель, 2016 20:16 ]
Заголовок сообщения:  Re: Константа для заголовка

С Александром соглашусь.
Пусть этот массив будет заведомо больше, чем размер изображения. Эта схема более простая.

Автор:  Иван Денисов [ Вторник, 12 Апрель, 2016 20:21 ]
Заголовок сообщения:  Re: Константа для заголовка

Спасибо за советы. Завтра попробую.

Автор:  Иван Денисов [ Среда, 13 Апрель, 2016 05:35 ]
Заголовок сообщения:  Re: Константа для заголовка

Alexander Shiryaev писал(а):
Замени "buffer: ANYPTR" на "buffer: POINTER [untagged] TO ARRAY [untagged] OF SHORTCHAR"
Все массивы (ARRAY) и записи (RECORD) должны быть с [untagged]. Ну и POINTERs тоже.

context*: ARRAY [untagged] 4 OF ANYPTR; (* в оригинале void* context[4]; *)
=>
PtrVoid = POINTER [untagged] TO RECORD [untagged] END;
context*: ARRAY [untagged] 4 OF PtrVoid;

Цитата:
Поскольку размер кадра может быть разный, то приходится буфер динамически выделять.

Сделай статический максимальной длины, да и всё.


Структуру определил так:
Код:
   VmbPixelFormat* = INTEGER;
   FrameStatus* = INTEGER;
   FrameFlags* = INTEGER;
   
   PtrVoid* = POINTER [untagged] TO RECORD [untagged] END;
   Buf* = POINTER [untagged] TO ARRAY [untagged] OF SHORTCHAR;
   
   Frame* = RECORD [untagged]
      buffer*:  Buf;
      bufferSize*: INTEGER;
      context*: ARRAY [untagged] 4 OF PtrVoid;
      receiveStatus*: FrameStatus;
      receiveFlags*: FrameFlags;
      imageSize*: INTEGER;
      ancillarySize*: INTEGER;
      pixelFormat*: VmbPixelFormat;
      width*: INTEGER;
      height*: INTEGER;
      offsetX*: INTEGER;
      offsetY*: INTEGER;
      frameID*: LONGINT;
      timestamp*: LONGINT;
   END;
   PtrFrame* = POINTER TO Frame;


Сделал статический массив с запасом и записываю ссылку на него по адресу буфера.
Код:
VAR buf: ARRAY [untagged] 5000000 OF SHORTCHAR;
...
frame.buffer := SYSTEM.VAL(Vmb.Buf, SYSTEM.ADR(buf));

Теперь все работает и не падает :)

Автор:  prospero78 [ Среда, 13 Апрель, 2016 09:15 ]
Заголовок сообщения:  Re: Константа для заголовка

Ну вот видишь) Всё-таки Си богомерзкий язык))))

Автор:  Иван Денисов [ Среда, 13 Апрель, 2016 10:56 ]
Заголовок сообщения:  Re: Константа для заголовка

Картинка с результатом. Изображение с камеры рисуется на элементе управления. Сохраняется по команде в PNG.

Вложение:
demo.png
demo.png [ 232.37 КБ | Просмотров: 11838 ]


Вот вся реализация прототипа сейчас, если кому-то интересна такая задачка.
Вложение:
Vmb.zip [14.47 КБ]
Скачиваний: 378

Зависит от подсистемы FreeImage.

Сама библиотека доступна в составе Vimba 2.0 SDK
https://www.alliedvision.com/en/products/software.html

Автор:  prospero78 [ Среда, 13 Апрель, 2016 15:19 ]
Заголовок сообщения:  Re: Константа для заголовка

Хм. Я правильно понимаю, что ты все сишные примеры переписывал под Компонентный Паскаль? Все штук 300 констант?))))
З.Ы. Неее... Там на сайте инсталляшка, примеров не вижу.

Автор:  Info21 [ Среда, 13 Апрель, 2016 18:36 ]
Заголовок сообщения:  Re: Константа для заголовка

Интересная задачка. Буду следить за прогрессом.

Автор:  Роман М. [ Среда, 13 Апрель, 2016 19:10 ]
Заголовок сообщения:  Re: Константа для заголовка

Иван Денисов писал(а):
Вот вся реализация прототипа сейчас, если кому-то интересна такая задачка.
Хорошо, это задача чисто о захвате изображения (data acquisition) или помимо этого стоит ещё задача обработки полученных изображений (я не о GIMP)?
Можно в другую тему (Отвлеченные темы), если что.

Автор:  Иван Денисов [ Среда, 20 Апрель, 2016 05:37 ]
Заголовок сообщения:  Re: Константа для заголовка

Роман М. писал(а):
Иван Денисов писал(а):
Вот вся реализация прототипа сейчас, если кому-то интересна такая задачка.
Хорошо, это задача чисто о захвате изображения (data acquisition) или помимо этого стоит ещё задача обработки полученных изображений (я не о GIMP)?
Можно в другую тему (Отвлеченные темы), если что.

Задача стоит обработки изображений на лету, чтобы не записывать много ненужных данных. Конкретно надо исследовать динамику растворения веществ внутри микрофлюидных чипов (времяразрешенная спектроскопия) и надо исследовать параметры капель воды в масле, которые генерируются в чипах на большой скорости.

Вложение:
demo2.png
demo2.png [ 332.88 КБ | Просмотров: 11690 ]


Сейчас удалось сделать прием картинок в двойной буфер. Пока идет прием в один буфер, второй обрабатывается.

Выяснилось, что блэкбокс очень не любит нарушения порядка своей внутренней работы. Библиотека вызывает Callback, когда завершает прием кадра. Так вот в этом вызове нельзя обновлять диалоговые окна, и в принципе лучше поменьше совершать действий, иначе сборщик мусора "сходит с ума". Я попытаюсь как-то этот опыт потом систематизировать.

Администрацию прошу, начиная с этого сообщения перенести обсуждения в подфоррум "Разработка библиотек и компонентов" под заголовком "Vimba - API для видеокамер Allied Vision"

Вложения:
vimba.zip [2.52 МБ]
Скачиваний: 374

Автор:  prospero78 [ Среда, 20 Апрель, 2016 08:55 ]
Заголовок сообщения:  Re: Константа для заголовка

По поводу схождения с ума и коллбэков.
Видимо, коллбэк не ограничивается одним лишь вызовом. На время обработки его надо либо запрещать, либо отключать.
По поводу растворения капель масла в чипе. Тут я очень смутно представляю себе вообще зачем это надо. А человек со стороны подумает: "Что только люди не придумают, лишь бы не работать")))

Автор:  Илья Ермаков [ Среда, 20 Апрель, 2016 16:40 ]
Заголовок сообщения:  Re: Константа для заголовка

Иван Денисов писал(а):
Библиотека вызывает Callback, когда завершает прием кадра. Так вот в этом вызове нельзя обновлять диалоговые окна, и в принципе лучше поменьше совершать действий, иначе сборщик мусора "сходит с ума". Я попытаюсь как-то этот опыт потом систематизировать.


Ну так вызов колбэка идёт из другого треда, естественно...
Если нужно синхронизировать, то надо завести критическую секцию в модуле колбэка,
в колбэке делать WinApi.EnterCriticalSection ... LeaveCriticalSection,
а дальше сделать Action, внутри которого наоборот: сначала LeaveCriticalSection, а потом EnterCriticalSection.
И в BEGIN модуля сделать EnterCriticalSection.
Тогда кэлбэкающий тред зависнет на критической секции, пока не сработает этот Action. Action освободит критическую секцию - и и тут же проскочит в неё кэлбэк-тред (если он ждал). А ББ-шный основной поток зависнет на EnterCriticalSection. Когда колбэк освободит секцию, то ББ-шный поток будет отпущен. И разошлись, как в море корабли.
Аналог рандеву в Аде, типа.

Автор:  Info21 [ Среда, 20 Апрель, 2016 20:59 ]
Заголовок сообщения:  Re: Константа для заголовка

Илья Ермаков писал(а):
Если нужно синхронизировать, то надо завести критическую секцию в модуле колбэка,
в колбэке делать WinApi.EnterCriticalSection ... LeaveCriticalSection
.......
Аналог рандеву в Аде, типа.

Хорошо бы сделать простой, но полный примерчик, когда будет возможность.

Автор:  Илья Ермаков [ Среда, 20 Апрель, 2016 22:29 ]
Заголовок сообщения:  Re: Vimba - API для видеокамер Allied Vision

Не могу обещать сейчас, я думаю, Иван у себя внедрит - и выложит )

Но если будет очень надо, то сделаю.

Автор:  Info21 [ Четверг, 21 Апрель, 2016 09:53 ]
Заголовок сообщения:  Re: Vimba - API для видеокамер Allied Vision

Заранее спасибо, кто бы ни сделал такой пример.

Автор:  Иван Денисов [ Среда, 27 Апрель, 2016 08:34 ]
Заголовок сообщения:  Re: Vimba - API для видеокамер Allied Vision

Пока нет времени доделать все моменты, но захотелось поделиться вот такой картинкой, как у меня блэкбокс в лаборатории помогает.
Приложения для управления смесителем и приложение для работы с камерой вместе работают для одного эксперимента.

Вложение:
bb_science.png
bb_science.png [ 535.05 КБ | Просмотров: 11546 ]

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/