• Чем сглаживать массив данных датчика?

    @vipermagi Автор вопроса
    С экспоненциальной будет то же, что и с обычной.
    40sma-vs-40ema.gif
    (мои данные ни как с форексами не связаны, если что :) )

    "это называется "первая производная стремится к 0"
    Может и не градиент, всё забывается :) Я имею в виду не скорость изменения функции, а ускорение изменения функции. Да и явно к нулю оно будет стремиться только на минимумах, двигаясь почти горизонтально. Получится нечто вот такое:
    \______/\_____/\____/\___/
  • Чем сглаживать массив данных датчика?

    @vipermagi Автор вопроса
    Скользящая средняя отстаёт. То есть, если график растёт, то скользящая средняя не сразу посчитает это ростом; и чем больше предыдущих значений брать, тем упорнее будет такое отставание.

    Чтобы на скользящей средней всё работало нормально, нужно, чтобы график ходил ровными волнами; тогда я смогу подобрать стабильное количество предыдущих значений, чтобы скользящая средняя была всегда внутри волны. Но проблема в том, что волны вседгда разные и по длине и по высоте, хоть в общем у них есть довольно жёсткие пределы по Y, но по X могут довольно сильно расходиться. По этому moving average алгоритм не очень подходит. К тому же, я его уже изначально использую. График MA стал ходить мелкими волнами внутри, этакий дребезжащий демпфер. Демпфер этот можно убрать нарастив количество предыдущих значений, график станет ровным, но тогда MA выскочит из потока оригинальных значений.

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

    Для этого мне нужно следить за наклоном. А чтобы следить за наклоном, нужно сравнивать на сколько больше следующее значение. Если график будет хоть немножко прыгать, он часто через раз будет показывать то направление вниз, то направление вверх. По этому я хочу исключить даже любые микро колебания. По задумке, когда угол роста сглаженного графика начинает резко уменьшаться (кажись это называется градиент), то это достижение максимума.
  • В чём лучше хранить метрики для графика?

    @vipermagi Автор вопроса
    https://db-engines.com/en/system/InfluxDB%3BSQLite
    Не умеет C++ и требует запуска сервера с кучей настроек инфраструктуры извне программы. Мне, наверное, идеально было бы безсерверное чудо, заточенное под "тайм серии". Чтобы, так сказать, СУБД была внутри моего клиента, а не как внешний компонент системы.

    Почему-то у меня такое ощущение, что ни чего кроме SQLite ещё не придумали.
  • Как можно улучшить распознавание еденичных символов по шаблонам?

    @vipermagi Автор вопроса
    Сделал, заработало, но быстрее не стало, совсем :(
  • Как можно улучшить распознавание еденичных символов по шаблонам?

    @vipermagi Автор вопроса
    У меня линукс.
    Вывод мусора я выяснил, это из-за того, что у меня три вон тех строчки были не после Init, а до. Как только вернул их так, как в первом посте, стало выводить почти нормально: в начале русская буква, потом перевод строки или, может быть, даже с пробелами. Где-то у меня была функция trim на это. Во: www.martinbroadhurst.com/how-to-trim-a-stdstring.html

    Почитал ещё документацию к GetUTF8Text, а там написано, что возвращаемое значение это указатель на char, который нужно делать delete[]. RAII :)

    Согласно https://github.com/tesseract-ocr/tesseract/wiki/Co...
    делаю вот так сразу после Init:
    m_tesseract_api.SetVariable("load_system_dawg", 0);
    m_tesseract_api.SetVariable("load_freq_dawg", 0);

    Программа падает без вывода на любой из этих строчек.
  • Как можно улучшить распознавание еденичных символов по шаблонам?

    @vipermagi Автор вопроса
    Как отключить эти словари?
    Вот мой кусок кода

    const std::string OCRCHARACTERS = "\u0410\u0412\u0415\u041A\u041C\u041D\u041E\u0420\u0421\u0422\u0423\u04250123456789";
    
        if(m_tesseract_api.Init(NULL, "rus", tesseract::OEM_DEFAULT))
        {
    	std::cerr << "Could not initialize tesseract.\n" << std::endl;
        }
    
        m_tesseract_api.SetVariable("tessedit_char_whitelist", OCRCHARACTERS.data());
        m_tesseract_api.SetPageSegMode(tesseract::PSM_SINGLE_CHAR); //<-- 10 = картинка это 1 символ
        m_tesseract_api.SetOutputName("out");


    Оно почему-то если так делать ещё и муру какую-то выдаёт в консоль
    std::string text_out;
        m_tesseract_api.SetImage((uchar*)sub.data, sub.size().width, sub.size().height, sub.channels(), sub.step1());
        text_out = m_tesseract_api.GetUTF8Text();
    
        std::cout << "single char: "+std::to_string(text_out.size())+" >" << text_out << "<" << std::endl;
    
        return text_out;

    И если поставлю в символы только цифры, то на конечном результате это не отражается. Должно вроде ASCII быть цифры одни, а нет - с переводами строки в консоль выводит. Думается, что-то с локалью, но по идее если стоит "rus" и UTF8, то оно должно само там где-то правильную строку создавать, для ru_RU.UTF-8. Вот я вывожу строку OCRCHARACTERS без проблем. Ожидаю, что GetUTF8Text мне таким же образом сформирует результат.
  • Какую веб-камеру выбрать для наиболее точного определения расстояния до объекта?

    @vipermagi Автор вопроса
    Ну это ведь не готовый прибор, а две отдельных камеры. Расстояние известно заранее после того, как его измерили. Вот, собственно, это и есть процесс первичного получения расстояния. Если брать какой-нибудь кинект, то там на заводе калибронули, вшили значение и готово. К тому же, в процессе разработки расстояние это будет экспериментально меняться и прийдётся иногда перекалибровывать.

    Объектив подороже всёравно прийдётся от искажений фильтровать. Я думаю в интернетах найду массу статей по радиально-тангенциальному искажению.

    1. объект всегда один
    2. я пока не уверен до конца, но объект всегда стоит вертикально лицевой частью в камеру, а его повороты вряд ли превысят погрешность точности алгоритма
    3. на данный момент думаю, выход из кадра одной камеры приравнять к выходу из обоих кадров
  • Какую веб-камеру выбрать для наиболее точного определения расстояния до объекта?

    @vipermagi Автор вопроса
    Изначальная мысль такая: две камеры смотрят параллельно на расстоянии друг от друга и в кадр помещается калибровочная сетка; центры картинок каждой камеры отмечают две точки на этой сетке; из чего вычисляется расстояние между камерами; по проекциям объекта на обе картинки можно восстановить углы; профит.

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

    Вот, кстати, интересный вопрос: как узнать расстояние "near" у камеры? Ну как в 3d графике расстояние до ближайшей плоскости проекции. Теоретически это даст наиболее точно востановить угол без всяких приближённых замеров руками.
  • Какую веб-камеру выбрать для наиболее точного определения расстояния до объекта?

    @vipermagi Автор вопроса
    Что за датчик угла такой? Я думал будет достаточно закрепить обе камеры параллельно ровно.

    По части освещения я пока не уверен, что его можно будет полностью игнорировать. К тому же нужно будет у камеры отколупывать фильтр, а люди пишут, есть камеры со вшитым фильтром.
  • Какую веб-камеру выбрать для наиболее точного определения расстояния до объекта?

    @vipermagi Автор вопроса
    Ценничек у этих чУдных приборов великоват. Ультразвуковые дальномеры и лидар они линейные, а нужен довольно широкий угол. Так называемая камера глубины kinect - это чёрно-белая cmos камера 640х480 с инфракрасным источником и обычная цветная камера. По некоторым причинам мне этот кинект не подойдёт.
  • Как разумнее разбить на разделы SDD под Linux?

    @vipermagi Автор вопроса
    На сайте бубунты написано, что у тебя есть для свопа выбор либо файл, либо раздел и примечание, что в случае файла suspend to disk не доступен в принципе. По этому первым делом для гибернации нужно создать раздел swap. Но гибенрация в менюшках от этого ещё не откроется. Нужно дальше шаманить. Хотя в консольке если писать, то будет работать.
  • Как разумнее разбить на разделы SDD под Linux?

    @vipermagi Автор вопроса
    Кстати сказать, в бубунте файл подкачки не умеет гибернацию. По этому тут только раздел подкачки.
  • Как разумнее разбить на разделы SDD под Linux?

    @vipermagi Автор вопроса
    theurs: во-первых удобнее же. Во-вторых если летит один раздел, то другой не летит, что уже хорошо. К тому же, я могу востановить быстрее хомяк, либо, не востанавливая рут сделать формат и переставить систему. Либо, если не бить, то я буду должен востанавливать не нужных 30 гигов, а это время на процесс и на разгрёб.

    А вот /boot наверно не нужен на SSD отдельным разделом, ибо главным образом нету быстрых и медленных мест у диска.
  • Как разумнее разбить на разделы SDD под Linux?

    @vipermagi Автор вопроса
    Ну на рабочем компе с бубунтой я её задействовал интернеты помнят как, правда выход из гибернации работает раз через два, в ядре чё-то накосячено. Но от этой беды должна вроде как помочь эта ссылочка: https://askubuntu.com/a/763516 .

    И, кстати, про uefi мне не понятны ходы. У меня старая матплата с биосом, но если на вырост разбивать диск, то наверное раздел этот будет нужен, как матплату сменю. Или не очень нужен, есть ведь опция legacy.

    При этом я не сторонник ставить всю систему на один раздел. Как минимум должен быть /home отгороженный от всяческих переустановок системы. Ну а /mnt/storage это на сколько размер ssd позволяет, если он 64Gb, то только рут да хом поместятся на нём. Нет особого смысла в отдаче всего диска под систему, если мне известно, что сейчас за годы использования у меня рут раздел занимает 24 гигабайта из своих 30, а хом под завязку почти все свои 20 и, если следить, то 20 ему хватает и за 30 он точно не выпрыгнет. И того: система занимает не более 60 гигабайт при многолетнем активном использовании.

    PS: поздравляю с рипом Торбы :)

    PPS: вот ещё мне Хряпт на Стаке начнёт отвечать, это будет поворот :)
  • Как сделать переносимый кросскомпилятор g++?

    @vipermagi Автор вопроса
    "/mnt/hdd/myApp/opt/myApp/devkit-x86/sysroots/x86_64-pokysdk-linux/usr/bin/i586-poky-linux/i586-poky-linux-g++" -v -std=c++11 -Wall -02 --sysroot="/mnt/hdd/myApp/opt/myApp/devkit-x86/sysroots/core2-32-poky-linux" -c -MD main.cpp -I. -o main.o
    /bin/sh: 1: /mnt/hdd/myApp/opt/myApp/devkit-x86/sysroots/x86_64-pokysdk-linux/usr/bin/i586-poky-linux/i586-poky-linux-g++: not found
    makefile:21: ошибка выполнения рецепта для цели «main.o»
    make: *** [main.o] Ошибка 127
  • Как сделать переносимый кросскомпилятор g++?

    @vipermagi Автор вопроса
    Вот все зависимости кросс компилятора:
    # ldd /usr/bin/g++
            linux-vdso.so.1 =>  (0x00007fffd55ff000)
            libc.so.6 => /lib64/libc.so.6 (0x00007f0647204000)
            /lib64/ld-linux-x86-64.so.2 (0x00007f0647561000)


    Строчка /lib64/ld-linux-x86-64.so.2 не соответствует и каждый раз рандомно новая должна быть.

    Опция --sysroot мной используется. Сам кросскомпилятор он x86_64 и лежит с обвесом в отдельном каталоге а рядом с этим лежит каталог с i586 sysroot системой, которую я и указываю в эту опцию.

    Для остальных библиотечных зависимостей помогают всякие экспорты в LD_LIBRARY_PATH, а этот ld-linux.so.2 ни как на них не реагирует.
  • Когда имеет значение порядок подключения заголовочных файлов?

    @vipermagi Автор вопроса
    Из всего этого я понял следующее. У меня каждый из классов обёрнут в один и тот же именованный namespace. При этом в функциях я названия классов использую не предваряя их XXX:: пространством, полагая, что они друг друга находясь в едином пространстве видят и так. Следовательно в коде существуют два объявления. Одно полное namespace XXX{ class A{}; } и одно предварительное class A; снаружи пространства имён. К любому из них изнутри пространства имён я могу обратиться по непосредственному имени A, исключив добавление к нему пространства имён. А вот вывод из опытов показывает, что то объявление будет связано с использованием по только имени класса, чей заголовочник будет первее в файле с использованием, а последующие заголовочники, при таком положении дел, идут лесом.

    Т.е. "первый случай" это не ::A, а просто A. ::A это вроде как не именованный namespace { class A;}
  • Когда имеет значение порядок подключения заголовочных файлов?

    @vipermagi Автор вопроса
    AtomKrieg: Ну ок, вам всего доброго, хорошего настроения и здоровья.
  • Когда имеет значение порядок подключения заголовочных файлов?

    @vipermagi Автор вопроса
    AtomKrieg: Обычно, вроде, отмечаю, во-первых. Во-вторых, ваш ответ, который исчез, он, технически, ни чего не решал, и в целом мне было не понятно почему компилятор прочитав и обещанное предварительное объявление и оба заголовочника вверху файла реализации дойдя до использования, имея всё прочитанное выше, стал так себя вести. В-третьих, в конце концов, всегда стараюсь ждать ещё возможных ответчиков, может выясниться всякое и даже противоположное первым ответам, и могут всплыть новые подробности.

    Мне вот не понятно, если класс нужен в заголовочнике, то почему компилятор сказал об этом в реализации?