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 [ 232.37 КБ | Просмотров: 11890 ] Вот вся реализация прототипа сейчас, если кому-то интересна такая задачка. Вложение: Зависит от подсистемы 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 [ 332.88 КБ | Просмотров: 11742 ] Сейчас удалось сделать прием картинок в двойной буфер. Пока идет прием в один буфер, второй обрабатывается. Выяснилось, что блэкбокс очень не любит нарушения порядка своей внутренней работы. Библиотека вызывает Callback, когда завершает прием кадра. Так вот в этом вызове нельзя обновлять диалоговые окна, и в принципе лучше поменьше совершать действий, иначе сборщик мусора "сходит с ума". Я попытаюсь как-то этот опыт потом систематизировать. Администрацию прошу, начиная с этого сообщения перенести обсуждения в подфоррум "Разработка библиотек и компонентов" под заголовком "Vimba - API для видеокамер Allied Vision"
|
Автор: | 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 [ 535.05 КБ | Просмотров: 11598 ] |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |