OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 17:05

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Vimba - API для видеокамер Allied Vision
СообщениеДобавлено: Вторник, 12 Апрель, 2016 08:49 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Заработала привязка к библиотеке 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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Вторник, 12 Апрель, 2016 10:44 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Стесняюсь спросить.
Ваня, а это вообще что и зачем?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Вторник, 12 Апрель, 2016 18:05 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
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);


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Вторник, 12 Апрель, 2016 18:44 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Вторник, 12 Апрель, 2016 19:55 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
Замени "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;

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Вторник, 12 Апрель, 2016 20:16 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
С Александром соглашусь.
Пусть этот массив будет заведомо больше, чем размер изображения. Эта схема более простая.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Вторник, 12 Апрель, 2016 20:21 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Спасибо за советы. Завтра попробую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 13 Апрель, 2016 05:35 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
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));

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 13 Апрель, 2016 09:15 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Ну вот видишь) Всё-таки Си богомерзкий язык))))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 13 Апрель, 2016 10:56 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Картинка с результатом. Изображение с камеры рисуется на элементе управления. Сохраняется по команде в PNG.

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


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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 13 Апрель, 2016 15:19 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Хм. Я правильно понимаю, что ты все сишные примеры переписывал под Компонентный Паскаль? Все штук 300 констант?))))
З.Ы. Неее... Там на сайте инсталляшка, примеров не вижу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 13 Апрель, 2016 18:36 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Интересная задачка. Буду следить за прогрессом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 13 Апрель, 2016 19:10 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 20 Апрель, 2016 05:37 
Аватара пользователя

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

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

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


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

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

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


Вложения:
vimba.zip [2.52 МБ]
Скачиваний: 371
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 20 Апрель, 2016 08:55 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
По поводу схождения с ума и коллбэков.
Видимо, коллбэк не ограничивается одним лишь вызовом. На время обработки его надо либо запрещать, либо отключать.
По поводу растворения капель масла в чипе. Тут я очень смутно представляю себе вообще зачем это надо. А человек со стороны подумает: "Что только люди не придумают, лишь бы не работать")))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 20 Апрель, 2016 16:40 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Иван Денисов писал(а):
Библиотека вызывает Callback, когда завершает прием кадра. Так вот в этом вызове нельзя обновлять диалоговые окна, и в принципе лучше поменьше совершать действий, иначе сборщик мусора "сходит с ума". Я попытаюсь как-то этот опыт потом систематизировать.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Константа для заголовка
СообщениеДобавлено: Среда, 20 Апрель, 2016 20:59 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Если нужно синхронизировать, то надо завести критическую секцию в модуле колбэка,
в колбэке делать WinApi.EnterCriticalSection ... LeaveCriticalSection
.......
Аналог рандеву в Аде, типа.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Vimba - API для видеокамер Allied Vision
СообщениеДобавлено: Среда, 20 Апрель, 2016 22:29 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Не могу обещать сейчас, я думаю, Иван у себя внедрит - и выложит )

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Vimba - API для видеокамер Allied Vision
СообщениеДобавлено: Четверг, 21 Апрель, 2016 09:53 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Заранее спасибо, кто бы ни сделал такой пример.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Vimba - API для видеокамер Allied Vision
СообщениеДобавлено: Среда, 27 Апрель, 2016 08:34 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Пока нет времени доделать все моменты, но захотелось поделиться вот такой картинкой, как у меня блэкбокс в лаборатории помогает.
Приложения для управления смесителем и приложение для работы с камерой вместе работают для одного эксперимента.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB