Передать изображение в несколько циклов

Простейшие вопросы в области инженерной разработки
Ответить
rushonda
adviser
adviser
Сообщения: 231
Зарегистрирован: 26 фев 2016, 06:31
Версия LabVIEW: 18-20
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Передать изображение в несколько циклов

Сообщение rushonda »

Добрый вечер.
Первый цикл грабит изображение с камеры.
Как максимально эффективно передать его в 3 других цикла (которые работают с разной скоростью)?
Я так понимаю, пока все циклы не обработают изображение буфер будет занят для граббинга (если конечно не создать несколько буферов для считывания кадра)
Поскольку передается не само изображение а ссылка, то есть такие варианты:

1) В основном цикле сделать 3 копии и переслать.
2) Перевести в Array и также переслать.
3) Видел на форуме Network Stream (непонятно ссылка передается или само изображение).
zxc_pavel
advanced
advanced
Сообщения: 192
Зарегистрирован: 02 июн 2016, 12:07
Версия LabVIEW: 15
Благодарил (а): 7 раз
Поблагодарили: 6 раз

Re: Передать изображение в несколько циклов

Сообщение zxc_pavel »

Я через очередь пиксели передаю, меня так устраивает (верхний цикл - захват, нижний - обработка)
В нижнем цикле - если в очереди что-то есть, то вытаскиваем.
В верхнем - если ничего в ней нет, то добавляем.
3101.png


Это внутри grab.vi
3101-1.png
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3641
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 3 раза
Поблагодарили: 35 раз
Контактная информация:

Re: Передать изображение в несколько циклов

Сообщение dadreamer »

Я тоже у себя в программах использую обычный байтовый массив (пункт 2, получается). Передаю через очереди и изредка через уведомители. Сейчас не начало 00-х, чтобы на "спичках" (т.е., на оперативке и ресурсах ЦПУ) экономить, да и картинки у меня обычно Grayscale (U8/U16), так что передаётся всё довольно быстро.
rushonda писал(а): 31 янв 2021, 20:343) Видел на форуме Network Stream (непонятно ссылка передается или само изображение).
Пишут, что инструменты достаточно интеллектуальны, чтобы извлечь буфер по 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
rushonda
adviser
adviser
Сообщения: 231
Зарегистрирован: 26 фев 2016, 06:31
Версия LabVIEW: 18-20
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Передать изображение в несколько циклов

Сообщение rushonda »

zxc_pavel писал(а): 31 янв 2021, 21:13 Я через очередь пиксели передаю, меня так устраивает (верхний цикл - захват, нижний - обработка)
В нижнем цикле - если в очереди что-то есть, то вытаскиваем.
В верхнем - если ничего в ней нет, то добавляем.
3101.png



Это внутри grab.vi
3101-1.png
Так пока очередь не освободится , я так понимаю не получится грабить новый кадр. Если очередь больше 1, то она будет расти. (я так понимаю это происходит что с image, что и с array)?
zxc_pavel
advanced
advanced
Сообщения: 192
Зарегистрирован: 02 июн 2016, 12:07
Версия LabVIEW: 15
Благодарил (а): 7 раз
Поблагодарили: 6 раз

Re: Передать изображение в несколько циклов

Сообщение zxc_pavel »

Я задаю максимальный размер очереди = 1.

Верхний цикл - быстрый, захват постоянно идет, просто перевод в пиксели и запись в очередь тогда, когда в очереди элементов нет.
Нижний цикл - медленный, там довольно долгая обработка изображения, в нем происходит вытаскивание из очереди.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2008
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 11 раз
Поблагодарили: 7 раз

Re: Передать изображение в несколько циклов

Сообщение Borjomy_1 »

zxc_pavel писал(а): 04 фев 2021, 12:56 Я задаю максимальный размер очереди = 1.

Верхний цикл - быстрый, захват постоянно идет, просто перевод в пиксели и запись в очередь тогда, когда в очереди элементов нет.
Нижний цикл - медленный, там довольно долгая обработка изображения, в нем происходит вытаскивание из очереди.
Вместо очереди, в таком случае, необходимо использовать Notifier
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»