Raspberry PI 3 + OpenCV + Arduino UNO + ......(поледнее решение и вопрос в последнем сообщении)

Тема в разделе "Флудилка", создана пользователем Igor68, 21 ноя 2016.

  1. ZAZ-965

    ZAZ-965 Гуру

    @Igor68, почему бы не воспользоваться libpng, вроде есть во всех дистрибутивах (глянул в OpenWrt -libpng 1.6.35-1 80kB)
     
    Igor68 нравится это.
  2. Igor68

    Igor68 Гуру

    Прочитал и не понял... если честно. Правда говорю. Ну и надеюсь ещё на то что будут устройства на которых нет возможности libpng. А то, что в OpenWrt есть даже не сомневаюсь... ведь там для роутеров, которые с web интерфейсом, а он с картинками. Мне же надо упаковать и распаковать только содержание. кстати libpng требует насколько помню zlib.
    Вот уже скоро неделя... а когда моторчики приедут будет не до этого.
     
  3. ZAZ-965

    ZAZ-965 Гуру

    Есть библиотека LodePNG без зависимостей.
     
    Igor68 нравится это.
  4. Igor68

    Igor68 Гуру

    Попробую. А если без зависимостей то вообще отлично. Наверное сейчас уже не успею. Спасибо!!! И похоже там пример конвертирования BMP в PNG.
    Теперь есть что покурить! А то только пью да пью...
     
  5. Igor68

    Igor68 Гуру

    Ну что могу сказать?
    РЕСПЕКТ!!!:):):) Ребята поставьте плюсик от меня ZAZ-965, а то я много не могу поставить - не позволено:(
    Вот буду наверное переделывать не на g++, а на gcc... а то на мои шаблоны(прошлые проекты) не пойдут... ну или сделаю g++ и gcc в одном Makefile... нет такого опыта. А компилировал так:
    Код (Text):
    g++ lodepng.cpp example_bmp2png.cpp -ansi -pedantic -Wall -Wextra -O3
    Надо подумать...
     
  6. Igor68

    Igor68 Гуру

    А если так:
    Код (Text):
    g++ lodepng.cpp example_bmp2png.cpp -ansi -pedantic -Wall -Wextra -O3 -o example_bmp2png
    то соответственно не a.out, а с указанным именем. Я указал example_bmp2png.
    Вот не могу сказать... на MOXA выйдет?
    Имею правило: если arm-linux-gcc для MOXA (IA240/UC-7112-Lx-plus) подходит, то не отбраковывается. Правда там есть и arm-linux-g++, но я не испытывал.
    Всё что делал включая и этот проект (ну кроме Open CV) работает и на UC-7112-Lx-plus.
     
    Последнее редактирование: 2 ноя 2018
  7. ZAZ-965

    ZAZ-965 Гуру

    @Igor68, g++ вроде символическая ссылка на компилятор соответствующей архитектуры. В Debian 9 x32 - i686-linux-gnu-gcc-6
     
    Igor68 нравится это.
  8. Igor68

    Igor68 Гуру

    Вот смотрите файл скриншот с экрана в BMP и PNG в архиве:
    1.zip
    Обратите внимание на качество и размер... качество одно и то же, а размер 1.5 Мб для BMP и 254.9 кб для PNG!
    и это после запуска этой программы:
    Код (Text):
    ./example_bmp2png 2.bmp 2.png
    Остаётся сделать только не из файла в файл, а из буфера в буфер. Ну и WEB страницу заменить тут:
    Код (C++):
    wsApp.init = function() {
                outputEl = document.getElementById("output");
            wscreen = document.getElementById("work");
                testWebSocket();
            ta = document.querySelector("#work");
            blob = new Blob([evt.data], {type: "image/bmp"});
        };
    на blob = new Blob([evt.data], {type: "image/png"});

    Спасибо дружище!!! Признателен очень!!!
     

    Вложения:

    • 1.zip
      Размер файла:
      445,3 КБ
      Просмотров:
      7
    Последнее редактирование: 2 ноя 2018
  9. Igor68

    Igor68 Гуру

    Вот пробую... (да куда он денется с подводной лодки!!!) из C++ в C. Хотел всё скрутить вместе... скручивается, но вызов функций из C++ и C перекрёстно - хрен там штанга! А переписывать/править из того, что есть в C++ что-то печально. Проще одну функцию encode повторить/вырвать из библиотеки... правда вместе с другими сопутствующими.
    Было дело реализовал camwork на C++... но правда только из-за OpenCV, примеры которого были как раз на C++ и курить тонкости не хотелось. А так сам лично предпочитаю чистый Си - там всё под "контролем". И не QtCreator это. Но сие действие не одной минуты.
     
  10. Igor68

    Igor68 Гуру

    ...Как говорю "выдёргиваю" функции из библиотеки, компилю, смотрю на то,что не так... поправка и с начала к новым функциям - рутина! И думать не надо. Те кто присели на C++ балдеют... я же на ЧИСТОМ СИ потому и долго.
     
  11. Видеопоток транслируют в jpg, а не png. Называется это mjpeg, и большинство камер умеет это делать аппаратно с помощью правильных настроек v4l
     
  12. Igor68

    Igor68 Гуру

    Понимаю, но:
    Код (C++):
    /*returns 1 if success, 0 if failure ==> nothing done*/
    static unsigned uivector_resize(uivector* p, size_t size)
    {
      if(!uivector_reserve(p, size * sizeof(unsigned))) return 0;
      p->size = size;
      return 1; /*success*/
    }

    /*resize and give all new elements the value*/
    static unsigned uivector_resizev(uivector* p, size_t size, unsigned value)
    {
      size_t oldsize = p->size, i;
      if(!uivector_resize(p, size)) return 0;
      for(i = oldsize; i < size; ++i) p->data[i] = value;
      return 1;
    }
    Тут две функции и много таких, которые:
    Код (C++):
    ...функция 1(....)
    {
    ...
    return...
    }
    ...функция2(....)
    {
    return функция1();
    }
    Во кайф!!! перебирать из пустого в порожнее! Может там какой-то смысл всевышнего? Но полоыина функций - пустышки! И что? Да ладно их менее 200 осталось!
     
  13. Igor68

    Igor68 Гуру

    Вроде про видеопоток разговора нет! ... и не было. Вообще-то в идеале данные должнннны быть в форме для OpenCV, а покадровое это только опционально для человека. В идеале на человека система реагирует как на "мусор" образно. Ему (человеку) даже нельзя ехать вперёд при достижении дистанции. Ту надо кластер... для него вся затея. А Вы Дядя Витя всегда делаете что-то где человек главный? Небось на продажу?
    А Вот хрен от вас принял про метод, что просил. Зато...
     
  14. Igor68

    Igor68 Гуру

    А как Вы будете анализировать видеопоток? Раба в машинку встроите с фразой "Искусственный интеллект из мяса"? Понимаю что стакан в стакан не впихнуть, и бутылку в бутылку так же... значит и голову в голову... значит только стратегия и остаётся. Вот только не надо про нейросети... ищем стратегию... но вот пока с мелочью не сладим. Но! Но работаем! Работаю... а множественное число для тех, кто солидарен... и подсказывает. Пью, Курю, сверлю, паяю, программирую... вот красить только пока не умею:)
     
  15. Igor68

    Igor68 Гуру

    А вообще-то я сказал грубо, и простите меня за это!!!
     
  16. Igor68

    Igor68 Гуру

    Доброго времени суток!
    сейчас всё компилируется... в gcc. Но вот в проекте имеется мой самодельный bmp.c. В нём есть определение количество бит на пиксель и т.п. Вот подбираю формат. Так же как и в примере применения (по ссылке выше от ZAZ-965) делаю файл BMP -> файл PNG. Конвертирование происходит... но не то, что надо - не разобрался пока. И устал перетаскивать функции типа static... надо в начало файла. Плюнул на всё и указал на них в заголовочном файле. правда возникли предупреждения типа:
    Код (Text):
    png.h:520:17: warning: ‘addChunk_IEND’ declared ‘static’ but never defined [-Wunused-function]
    png.h:521:17: warning: ‘addChunk_iTXt’ declared ‘static’ but never defined [-Wunused-function]
    png.h:523:17: warning: ‘addChunk_tEXt’ declared ‘static’ but never defined [-Wunused-function]
    png.h:524:17: warning: ‘addChunk_zTXt’ declared ‘static’ but never defined [-Wunused-function]
    png.h:526:17: warning: ‘addChunk_tIME’ declared ‘static’ but never defined [-Wunused-function]
    png.h:527:17: warning: ‘addChunk_IDAT’ declared ‘static’ but never defined [-Wunused-function]
    png.h:529:17: warning: ‘addChunk_pHYs’ declared ‘static’ but never defined [-Wunused-function]
    png.h:530:17: warning: ‘addChunk_bKGD’ declared ‘static’ but never defined [-Wunused-function]
    png.h:531:17: warning: ‘addChunk_tRNS’ declared ‘static’ but never defined [-Wunused-function]
    png.h:532:17: warning: ‘getPaletteTranslucency’ declared ‘static’ but never defined [-Wunused-function]
    png.h:533:17: warning: ‘addChunk_PLTE’ declared ‘static’ but never defined [-Wunused-function]
    png.h:534:17: warning: ‘addChunk_cHRM’ declared ‘static’ but never defined [-Wunused-function]
    png.h:535:17: warning: ‘addChunk_gAMA’ declared ‘static’ but never defined [-Wunused-function]
    png.h:536:17: warning: ‘addChunk_sRGB’ declared ‘static’ but never defined [-Wunused-function]
    png.h:537:13: warning: ‘ucvector_cleanup’ declared ‘static’ but never defined [-Wunused-function]
    png.h:538:17: warning: ‘addChunk’ declared ‘static’ but never defined [-Wunused-function]
    ...
    ...
    Надоело... думаю плюну ещё и скажу, что они не static, но надо курить переменные:confused:.
    Ну буду курить далее! Пока есть время!
    Вот созданный тестовый BMP:
    snapshot24.png
    А вот то, что сконвертировал:
    snapshot25.png
    Хрень какая-то. Благо есть пример. Но зато работает (пока не правильно) и на UC-7112-Lx-Plus. На крайний случай буду переименовывать файлы c на cpp проекта, прицеплю исходные файлы и укажу g++ вместо gcc.
     
  17. Igor68

    Igor68 Гуру

    И вот та первая картинка, что не изуродована в формате BMP размера 768122байт упакована в PNG в размер 195383байт... надо просто правильно указать режим упаковки и формат картинки. Работает!!! Правда работало и в CPP, но тут чистый C. Устал что-то... завтра испытаю на MOXA и компилятор для него за одно. Там он(компилятор) построже будет. Он UC-7112-Lx-Plus имеет тактовую частоту процессора менне 200МГц... и ОЗУ 32Мб, где свободно 5Мб с работающим Apache.
     
  18. Igor68

    Igor68 Гуру

    Доброго времени суток!
    PNG... вот пока не знаю, что надо, но рабочий тест тут:
    http://forum.amperka.ru/threads/websocket-на-Си-имеет-ли-кто-опыт.15338/page-2
    А вот упаковка в проекте Арматурчика тут в архиве:
    mainwork_05_11_2018.zip
    Собственно заменена передача BMP на PNG. И соответственно в index.html изменено:

    Код (Javascript):
    ....
    var ta;
        var blob;

        wsApp.init = function() {
                outputEl = document.getElementById("output");
            wscreen = document.getElementById("work");
                testWebSocket();
            ta = document.querySelector("#work");
            //blob = new Blob([evt.data], {type: "image/bmp"});
            blob = new Blob([evt.data], {type: "image/png"});
        };
    ...
    Загрузка сети изменена(снижена), но браузер на нагрузку занятости ОЗУ проверяю в сей час.
    ...
     

    Вложения:

  19. Igor68

    Igor68 Гуру

    Доброго времени суток! И вот моторчики привезли, поставлены и автономное питание приделано как для контроллеров (малина и дуня) и для моторчиков и сервомашин, понятно что через шилды:
    20181117_195539.jpg
    20181117_195606.jpg
    Дома ремонт, потому как грязь и пыль:
    Надоело жить в Рязани,
    Всюду копоть, грязь и пыль,
    Надо сделать обрезанье,
    И уехать в ИзрАиль!
    (повторяюсь уже)

    И что испытания?
    Да вроде всё нормально, едет и слушается но... но вот только коты (4 особи, а 5-й спал) собрались кругом перед мордой арматурчика. А тот получив короткую дистанцию от сонара остановив движение, непрерывно сканировал пространство по горизонтали поворачивая морду то вправо, то влево. Коты (ну и кошки) обнюховали подвижную морду и иногда тормозили её передней лапой. Не все конечно. Всё конечно было в браузере. Арматурчика срочно надо было спасать. Это программа сонар захватила управления и ничего поделать нельзя потому как у ручного управления по websocket низший приоритет. Таким образом сейчас полностью переделывается логика управления программы sonar.
    Кстати котов не отобразил, сейчас наелись и спят. А я просто сфоткал телефлном. Грязно конечно - ремонт. Линолеум (не в этой комнате) снят и везде всё разнесено.
     
  20. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Возник небольшой вопрос:
    В работе программы wsbot происходит передача картинки браузеру и приём команды от него. Соответственно передача и приём идут по одному сокету в одном потоке сервера при обслуживании клиента. На доступ к картинке (глобальной в формате PNG) из потока требуется некоторое время, так же на её передачу. А только после этого приём и обработка команды от клиента. Соответственно они разделены по времени. Таким образом реакция моторов с момента подачи параметра от браузера доходит до 4 секунд в общем.

    И собственно вопрос (выбор):
    1) Имеет ли смысл сделать передачу картинки в одном потоке, а приём команд в другом. То есть применяя один и тот же сокет разными потоками производить приём и передачу. Ну наверное не прям так буквально, что не выйдет, а максимально распределённо... образно.
    2) Сделать два сокета и соответственно для них два разных потока. Но нет опыта организовать обработку событий со стороны клиента в браузере на HTML + JS. Пока умею только с одним сокетом в websocket.

    Следует учесть, что индикация накладывается на картинку (прорисовывается на данные от web-камеры) и только потом формируется PNG для передачи из буфера программы в цикле main. Ну соответственно эта картинка глобальна как для потока сервера, так и для цикла main. Синхронизация по мютексу и задержка доступа к картинке в одном потоке, тормозит работу с ней в другом. В цикле main так же происходит анализ команд принятых сервером от клиента и соответственно там тоже синхронизация по мютексу, но уже другому. А кроме того есть синхронизация по семафору для синхронизации доступа к данным картинки и параметров с программами servoANDmotor, sonar и camwork через разделяемую память в /dev/shm, что в своё время так же производит задержку.

    inf:
    http://citforum.ru/programming/unix/sockets/
    https://coollib.com/b/291254

    book:
    Stivens_UNIX_razrabotka_setevyih_prilozheniy_67be72_291254.fb2.zip

    Заранее спасибо.
     

    Вложения:

    Последнее редактирование: 20 ноя 2018 в 17:31