Передать изображение в несколько циклов
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Передать изображение в несколько циклов
Добрый вечер.
Первый цикл грабит изображение с камеры.
Как максимально эффективно передать его в 3 других цикла (которые работают с разной скоростью)?
Я так понимаю, пока все циклы не обработают изображение буфер будет занят для граббинга (если конечно не создать несколько буферов для считывания кадра)
Поскольку передается не само изображение а ссылка, то есть такие варианты:
1) В основном цикле сделать 3 копии и переслать.
2) Перевести в Array и также переслать.
3) Видел на форуме Network Stream (непонятно ссылка передается или само изображение).
Первый цикл грабит изображение с камеры.
Как максимально эффективно передать его в 3 других цикла (которые работают с разной скоростью)?
Я так понимаю, пока все циклы не обработают изображение буфер будет занят для граббинга (если конечно не создать несколько буферов для считывания кадра)
Поскольку передается не само изображение а ссылка, то есть такие варианты:
1) В основном цикле сделать 3 копии и переслать.
2) Перевести в Array и также переслать.
3) Видел на форуме Network Stream (непонятно ссылка передается или само изображение).
- zxc_pavel
- adviser
- Сообщения: 242
- Зарегистрирован: 02 июн 2016, 12:07
- Версия LabVIEW: 15
- Благодарил (а): 9 раз
- Поблагодарили: 23 раза
- Контактная информация:
Re: Передать изображение в несколько циклов
Я через очередь пиксели передаю, меня так устраивает (верхний цикл - захват, нижний - обработка)
В нижнем цикле - если в очереди что-то есть, то вытаскиваем.
В верхнем - если ничего в ней нет, то добавляем.
Это внутри grab.vi
В нижнем цикле - если в очереди что-то есть, то вытаскиваем.
В верхнем - если ничего в ней нет, то добавляем.
Это внутри grab.vi
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
Я тоже у себя в программах использую обычный байтовый массив (пункт 2, получается). Передаю через очереди и изредка через уведомители. Сейчас не начало 00-х, чтобы на "спичках" (т.е., на оперативке и ресурсах ЦПУ) экономить, да и картинки у меня обычно Grayscale (U8/U16), так что передаётся всё довольно быстро.
upd: Проверил, так и есть. "Писатель" создаёт копию изображения с именем вида remote image 00000000217BA4E8 @ 1C-BD-B9-D8-11-CF pid 00001CAC. Имя уникально для одного экземпляра приложения, причём может меняться внутри самой программы в процессе её работы (об этом уже когда-то писали, только без привязки к Network Streams: viewtopic.php?p=35914#p35914 ). Если создать два канала NW Streams (т.е., две пары "читатель"-"писатель"), то иногда оба "писателя" могут брать одно и то же имя для изображения. В таком случае возможны разного рода коллизии. В общем, рекомендую передавать непосредственно массив и не заморачиваться со ссылками: https://digital.ni.com/public.nsf/allkb ... 05003F207A
Пишут, что инструменты достаточно интеллектуальны, чтобы извлечь буфер по IMAQ-ссылке и создать внутреннюю копию для передачи. Если время будет, завтра проверю на примере.
upd: Проверил, так и есть. "Писатель" создаёт копию изображения с именем вида remote image 00000000217BA4E8 @ 1C-BD-B9-D8-11-CF pid 00001CAC. Имя уникально для одного экземпляра приложения, причём может меняться внутри самой программы в процессе её работы (об этом уже когда-то писали, только без привязки к Network Streams: viewtopic.php?p=35914#p35914 ). Если создать два канала NW Streams (т.е., две пары "читатель"-"писатель"), то иногда оба "писателя" могут брать одно и то же имя для изображения. В таком случае возможны разного рода коллизии. В общем, рекомендую передавать непосредственно массив и не заморачиваться со ссылками: https://digital.ni.com/public.nsf/allkb ... 05003F207A
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
Так пока очередь не освободится , я так понимаю не получится грабить новый кадр. Если очередь больше 1, то она будет расти. (я так понимаю это происходит что с image, что и с array)?
- zxc_pavel
- adviser
- Сообщения: 242
- Зарегистрирован: 02 июн 2016, 12:07
- Версия LabVIEW: 15
- Благодарил (а): 9 раз
- Поблагодарили: 23 раза
- Контактная информация:
Re: Передать изображение в несколько циклов
Я задаю максимальный размер очереди = 1.
Верхний цикл - быстрый, захват постоянно идет, просто перевод в пиксели и запись в очередь тогда, когда в очереди элементов нет.
Нижний цикл - медленный, там довольно долгая обработка изображения, в нем происходит вытаскивание из очереди.
Верхний цикл - быстрый, захват постоянно идет, просто перевод в пиксели и запись в очередь тогда, когда в очереди элементов нет.
Нижний цикл - медленный, там довольно долгая обработка изображения, в нем происходит вытаскивание из очереди.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Передать изображение в несколько циклов
Вместо очереди, в таком случае, необходимо использовать Notifierzxc_pavel писал(а): ↑04 фев 2021, 12:56 Я задаю максимальный размер очереди = 1.
Верхний цикл - быстрый, захват постоянно идет, просто перевод в пиксели и запись в очередь тогда, когда в очереди элементов нет.
Нижний цикл - медленный, там довольно долгая обработка изображения, в нем происходит вытаскивание из очереди.
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
Всегда передается U32 массив, а во втором цикле опять происходит преобразование из U32 в Image?
Вы этот вариант используете что для кадров с камеры U8, что для U16 т.д. ?
Есть ли смысл передавать не RGB в случае если изображение граббится U8 или U16 c точки зрения скорости передачи?dadreamer писал(а): ↑31 янв 2021, 22:19 В общем, рекомендую передавать непосредственно массив и не заморачиваться со ссылками: https://digital.ni.com/public.nsf/allkb ... 05003F207A
-
- professor
- Сообщения: 3403
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 172 раза
- Контактная информация:
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
Если с камеры забирается сразу U8/U16, то зачем вообще иметь дело с U32? Выставьте везде ваше представление данных и работайте с ним. Тем более что большинство IMAQ инструментов всё равно принимают на вход U8/U16 и при подаче U32 он будет неявно преобразован.
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
Согласен с Вами. Хочу просто максимально правильно передавать изображение в другой цикл с учетом того, что формат может поменяться например с U8 на U16, тогда первый вариант не подходит (на картинке), нормально ли использовать преобразование в variant как во втором варианте?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
Если формат поменяется, в любом случае придётся вносить изменения в программу:
- тип изображения у инструментов IMAQ Create;
- представления массивов-констант, задающих тип провода для сдвигового регистра/очереди/уведомителя и т.п.;
- входные и выходные терминалы у IMAQ инструментов.
Поэтому лучше заранее определиться с форматом данных. U16 - если нужна повышенная точность при обработке (например, важно нахождение границ объекта вплоть до отдельных пикселей), U8 - если такой точности не требуется. В большинстве случаев хватает U8, если "блох" / микроны ловить не собираетесь.
В variant я никогда не конвертировал и думаю, что в этом профита нет.
- тип изображения у инструментов IMAQ Create;
- представления массивов-констант, задающих тип провода для сдвигового регистра/очереди/уведомителя и т.п.;
- входные и выходные терминалы у IMAQ инструментов.
Поэтому лучше заранее определиться с форматом данных. U16 - если нужна повышенная точность при обработке (например, важно нахождение границ объекта вплоть до отдельных пикселей), U8 - если такой точности не требуется. В большинстве случаев хватает U8, если "блох" / микроны ловить не собираетесь.
В variant я никогда не конвертировал и думаю, что в этом профита нет.
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
С подготовкой само собой - заново инициализируем буферы согласно новому типу. Как быть с тем, что в сдвиговый регистр пойдет другой тип данных (вместо U8 например U16) - как его в процессе поменять?dadreamer писал(а): ↑13 июл 2021, 21:22 Если формат поменяется, в любом случае придётся вносить изменения в программу:
- тип изображения у инструментов IMAQ Create;
- представления массивов-констант, задающих тип провода для сдвигового регистра/очереди/уведомителя и т.п.;
- входные и выходные терминалы у IMAQ инструментов.
Поэтому лучше заранее определиться с форматом данных. U16 - если нужна повышенная точность при обработке (например, важно нахождение границ объекта вплоть до отдельных пикселей), U8 - если такой точности не требуется. В большинстве случаев хватает U8, если "блох" / микроны ловить не собираетесь.
В variant я никогда не конвертировал и думаю, что в этом профита нет.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
Тут поменяете, и провод примет новое представление. Для уверенности катушкой наводите на провод и смотрите подсказку в context help. Также следите за красными точками, точнее, за их отсутствием.
-
- developer
- Сообщения: 289
- Зарегистрирован: 26 фев 2016, 06:31
- Версия LabVIEW: 18-20
- Благодарил (а): 6 раз
- Поблагодарили: 7 раз
- Контактная информация:
Re: Передать изображение в несколько циклов
Так появляется красная точка. смысл менять представление прямо в процессе работы...
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 2 Ответы
- 548 Просмотры
-
Последнее сообщение Юрий