Задать вопрос
  • Где найти задачу на распределенные вычисления?

    ErmIg
    @ErmIg
    Программист
    У вас неправильный порядок действий. Надо было не решать абстрактную задачу путем распределенных вычислений, а потом искать куда бы ее можно применить. Правильный путь, хотя конечно это мое сугубо личное мнение, это при наличии реальной задачи - пытаться ускорить ее при помощи распределенных вычислений, если это конечно требуется и если это возможно. Потому как все задачи разные в плане требований к вычислительным ресурсам, памяти, возможности распараллеливания. И потому не возможно создать систему одинаково эффективную для них всех.
    Ответ написан
  • Распознавание объектов на изображении?

    ErmIg
    @ErmIg
    Программист
    Готового решения для классификации клеток скорее всего нет - потому как задача достаточно специфическая.
    Однако при должном опыте вполне решаемая при помощи уже существующих алгоритмов компьютерного зрения, которые имеются в открытом доступе.

    Рекомендую смотреть в сторону OpenCV.

    Собственно ваша конкретная задача распадается на две под задачи :
    1) Обнаружение клеток.
    2) Их классификация.

    По первому вопросу, судя по всему можно применять или детектор кругов (у всех клеток форма приблизительно одинаково круглая в первом приближении), или натренировать на их обнаружение какой-нибудь детектор из OpenCV (HAAR, LBP или HOG).

    По второму пункту - проанализировать свойства клеток, выбрать характеристики по которым их различие наибольшее и натренировать какой-нибудь классификатор (Например SVM).
    Ответ написан
    Комментировать
  • Какую литературу можете посоветовать по Computer Vision?

    ErmIg
    @ErmIg
    Программист
    В свое время читал "Цифровая обработка изображений" Рафаэль Гонсалес, Ричард Вудс. Рекомендую ее.
    Ответ написан
    Комментировать
  • Есть программы которые смогли бы улучшить качество видео?

    ErmIg
    @ErmIg
    Программист
    Есть программы, которые позволяют улучшить качество расфокусированной картинки. Правда такие методы обычно чувствительны к шуму.
    Ответ написан
    Комментировать
  • Как создать библиотеку на c++ и подключить её к проекту на c#?

    ErmIg
    @ErmIg
    Программист
    У меня есть пример приложения, написанного на C#, которое использует библиотеку, написанную на C++.
    Ответ написан
    Комментировать
  • Как получить указатель на инстанированную шаблонную функцию в Visual Studio 6.0?

    ErmIg
    @ErmIg
    Программист
    Может поможет что то вроде этого:
    template<class T> void test(void) {
    }
    typedef void (*Fn)(void);
    Fn fn = (Fn)test<int>;
    Ответ написан
  • Как автоматически посчитать людей в вагоне метро при помощи видеокамеры?

    ErmIg
    @ErmIg
    Программист
    Ваш алгоритм может базироваться на следующих принципах:

    1) Детектирование движения на фоне неподвижного фона, сегментация движущихся объектов, их сопровождение, а в конце подсчет числа траекторий, которые пересекают вход/выход. В ваше случае этот подход, скорее всего, работать не будет, так как будут проблемы с выявлением фона и с сегментацией отдельных людей - в метро слишком много народа - все будет сливаться.

    2) Детектирование на основе выявления потоков движения (или эквивалентный корреляционный метод) - выявляете над входом/выходом области характерного размера, движущиеся в заданном направлении и считаете их. Данный метод тоже скорее всего не будет работать из-за того, что в метро слишком много народа и часто они идут вплотную друг к другу.

    3) Детектирование людей на основе их вида сверху при помощи HAAR, HOG или LBP каскада (смотри OpenCV). Затем трекинг (например корреляционный), а в конце подсчет числа траекторий, которые пересекают вход/выход. Каска/Каскады потребуется обучить (готовых для такого ракурса я не встречал). Минусы - люди слишком разные (шляпы прически, поворот относительно камеры), каскады хорошо работают с похожими объектами (лицами например).

    4) Отказаться от видео анализа и посмотреть в стороны аппаратных датчиков (хотя я в них не специалист, ничего посоветовать не могу).
    Ответ написан
    1 комментарий
  • C++, Windows, msvc - какой обфускатор применить?

    ErmIg
    @ErmIg
    Программист
    Если вы используете наитивный компилятор С++, то просто соберите проект без DEBUG информации (в релизе) или с упаковщиком . Если managed компилятор, то есть обзора обфускаторов на Хабре:
    habrahabr.ru/post/97062
    Ответ написан
    5 комментариев
  • Есть ли основные правила супер оптимизации?

    ErmIg
    @ErmIg
    Программист
    Есть развернутый ответ для С++ кода, но его можно обобщить и на другие языки и платформы:

    Если приложение уже написано, то для начала следует с помощи профилировщика найти в программе узкие места (участки кода, на выполнение которых тратится наибольшее количество времени). Когда такие участки найдены, то можно приступать к их оптимизации. Важно помнить, что, как правило, любая оптимизация ухудшает читаемость кода, потому не следует заниматься оптимизацией там, где это непосредственно не требуется. В процессе оптимизации легко можно совершить ошибки, потому очень желательно перед оптимизацией обложить оптимизируемый функционал юнит-тестами.

    1) Важно понимать, что алгоритмическая оптимизация практически всегда может дать лучший эффект, чем программная. Так, если алгоритм имеет сложность O(n^2), то на больших исходных данных он при любой оптимизации будет медленнее, чем неоптимизированный алгоритм сложности O(n). Впрочем, при выборе алгоритма, опираться только на его сложность не стоит: если объем исходных данных не велик, то вполне может оказаться, что алгоритм со сложностью O(n^2) будет работать быстрее, чем с O(n).
    2) Очень важно повторное использование (кеширование) промежуточных данных, вычисленных в программе – ибо быстрее всего выполняется работа, которую не надо делать. Тем не менее, не надо чрезмерно кешированием увлекаться – если объем кэшируемых данных слишком велик, то это может отрицательно сказаться на общей производительности программы (некоторые данные быстрее вычислять на лету, чем считывать из памяти).
    3) Следует избегать излишнего копирования данных (например, передавать сложные типы данных по ссылке, а не по значению).
    4) По возможности следует избегать условных операторов во вложенных циклах. Так как условные переходы, вызываемые такими операторами, плохо обрабатываются современными процессорами с конвейерной архитектурой.
    5) Данные в памяти, которые используются алгоритмами, должны по возможности лежать упорядочено, и использоваться последовательно. Это позволит процессору их эффективно кешировать. Важно помнить, что доступ к кэшу процессора значительнее быстрее, чем к оперативной памяти.
    6) Если алгоритмы это позволяют, то возможно стоит реализовать их параллельное исполнение (в отдельных потоках или процессах). Это позволит эффективно задействовать современные многоядерные процессы.
    7) В некоторых случаях (например обработка изображений) большого эффекта можно достичь применением специализированных расширений процессора (SSE, SSE2, AXX, AVX2 и другие). Стоит отметить, что большинство современных компиляторов (GCC, MSVS, ICC) поддерживают непосредственное использование данных расширений непосредственно из С++ кода при помощи специальных встроенных функций (intrinsics). Минусами такого подхода является потеря переносимости (впрочем, эта проблема решается наличием разных веток программы под разные процессоры) и значительное усложнение программы.
    8) Также большого эффекта можно достичь применением специализированных ускорителей, например GPU (технологии CUDA, OpenCL). Минусами таких решений являются потеря универсальности и значительное усложнение программы, а также то, что на специализированных ускорителях, как правило, хорошо работает далеко не каждый алгоритм.
    Ответ написан
    Комментировать
  • Как удалять табуляцию?

    ErmIg
    @ErmIg
    Программист
    Для Visual Studio была такая волшебная комбинация клавиш: Control + K а потом Control+ F - авто выравнивание выделенного куска кода.
    Ответ написан
    1 комментарий
  • Как бороться с пропаданием деталей изображения после сохранения (.NET Bitmap)?

    ErmIg
    @ErmIg
    Программист
    Зависит от того, в каком формате вы сохраняете картинку. Если вам нужно без потерь, то рекомендую использовать формат PNG.
    Ответ написан
  • Как совместить два изображения через параметры о цвете RGB?

    ErmIg
    @ErmIg
    Программист
    Для каждой точки каждого канала RGB:
    dst  = (foreground*transparency + background*(255 - transparency))/255;

    Здесь предполагается, что у нас 1 байт на канал. Прозрачность может быть как одинаковой для всего изображения, так и меняться от точки к точке.
    Ответ написан
    Комментировать
  • Какую библиотеку выбрать для работы с изображениями в Java?

    ErmIg
    @ErmIg
    Программист
    Берите классику: OpenCv, которая позволяет ее использование в том числе и из Java.
    Ответ написан
    Комментировать
  • Частичная специализация шаблона класса: как грамотно реализовать?

    ErmIg
    @ErmIg
    Программист
    Можно посмотреть пример аналогичной библиотеки: BOOST::GIL. Может быть даже им и воспользоваться.

    P.S. Хотя, толку от всех этих шаблонов не так много, как хотелось бы, больше проблем. На данный момент Boost::Gil мы уже не используем, есть собственный велосипед для работы с изображениями.
    Ответ написан
    Комментировать
  • Как правильно сравнить массивы и оценить их схожесть?

    ErmIg
    @ErmIg
    Программист
    По сути, кольца чисел - это периодические фунции. Лучше сравнивать не сами значения, их фурье спектры. Если отбросить фазу комплексного фурье спектра, то спектры таких колец будут схожими, даже если их отсчитывать с разных позиций.
    Ответ написан
    Комментировать
  • Где 128-битные процессоры?

    ErmIg
    @ErmIg
    Программист
    Тут важно, что вы понимаете под 128-bit процессорами?
    1) Если способность работать с 128-bit указателями, то наверное это в обозримом будущем не потребуется, так как пока вполне хватает 64-bit указателей, которые могут адресовать порядка 10^19 байт.
    2) Если способность работать с вещественными числами разрядностью в 128-bit, то такой процессор был в 70-е IBM_System/370, но затем от аппаратной поддержки таких чисел отказались за ненадобностью.
    3) Если способность работать с целыми числами разрядностью в 128-bit, то такой процессор тоже был в 80-е VAX (правда для работы с 128 разрядными числами там использовалось 4 32-bit регистра), но затем от аппаратной поддержки таких чисел тоже отказались.
    4) Если просто наличие 128-bit регистров, то такие процессоры давно есть (уже есть и 256-bit, а в ближайшее время ожидается и 512-bit), правда хранятся в них не одиночные числа, а вектора вещественных или целых числе меньшей разрядности.
    Ответ написан
    Комментировать
  • Глобальные переменные или частое пересоздание локальных?

    ErmIg
    @ErmIg
    Программист
    Если используются 4 временных переменных типа double - это 32 байта. При частом их использовании они будут лежать в кеше процессора, если даже не в его регистрах. Если вы их сделаете глобальными никакого выигрыша не будет, если только там нет какого-нибудь сложного алгоритма их инициализации. Но при наличии глобальных переменных есть очевидный минус - при много поточном использовании вашей функции могут возникнуть большие проблемы.
    Ответ написан
    Комментировать
  • Как определить есть ли остаток от деления в c++?

    ErmIg
    @ErmIg
    Программист
    В C++ остаток от деления определяется оператором %. Например:
    int a = 5 % 3;
    Ответ написан
    Комментировать
  • Как определить пересечение линии объектом с помощью opencv?

    ErmIg
    @ErmIg
    Программист
    Так как я подобными задачами занимаюсь уже 7 лет, то могу с уверенностью сказать следующее:
    Задача специфическая - объекты слишком большие, потому обычный детектор движения из OpenCV с трекером скорее всего не подойдет . Следовательно, готового решения с исходниками в открытом доступе скорее всего нет. Вполне возможно, что такие задачи уже решались, причем неоднократно в коммерческих проектах. По понятным причинам вам разработчики его бесплатно скорее всего не дадут.
    Задача выглядит как вполне решаемая. Однако, есть масса нюансов, которые придется учесть, что бы детектирование машин было надежным: в основном они связаны с вариабельностью освещенности и размеров машин. Для решения этих проблем желательно иметь опыт в компьютерном зрении, что подразумевает хорошее знание программирования, математики и алгоритмов.
    Ответ написан
    Комментировать