Перейти к содержимому
Compvision.ru
Александр

моргающий светодиод с подвижной сценой

Recommended Posts

Доброго времени суток.

Задача вот какая. Нужно найти моргающий светодиод, при этом камера может перемещаться.

СВЕТОДИОД(синий) моргает и гаснет примерно с равными интервалами на частоте примерно 17Гц. Подбирал на глаз, так чтобы в серии кадров 1 был полностью горящий светодиод, и 1 полностью потухший. Частоту моргания кстати можно менять не чаще 1 раза в день - программатор для самопальной платы берется из рабочего инвентаря по ночам :)

КАМЕРА выдает 120 китайских фпс, что в пересчете на наши будет около 100 при разрешении 640х480 или 320х240. (Кстати ОпенСВ так и позволило делать захват чаще 30 кадров, пробовал по разному, но либо я дурак, либо в 2.4.11 на этом моменте связаны руки, поэтому немного по ковырявшись прикрутил захват с v4l2) У камеры роллинг шаттер и по этому когда светодиод гаснет или загорается на кадре видно часть зажженного и часть погасшего светодиода:)

 

Первой мыслей было просто зажечь светодиод и искать его в HSV пространстве, но в кадр постоянно попадают посторонние предметы, которые мешают искать светодиод.

На второй итерации я наделил светодиод более уникальными свойствами и заставил моргать т.к. в кадре более ничего моргающего нету.

frame-19.thumb.jpg.63ab2cf3c59ffb73972c1frame-18.thumb.jpg.1690ac8cba3c10d0417beframe-17.thumb.jpg.80abd1c0cef6ff053416c

 

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

 

frame-14.thumb.jpg.e0f4fd5959422dd126daeframe-15.thumb.jpg.b84635c0cabbb4b793cb4

 

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

frame-2422.thumb.jpg.7c9ec59c11d62c1100aframe-2424.thumb.jpg.0d92d68b2f22039da75New_frame

 

frame-61.thumb.jpg.93ea45d7f276b2743a897frame-60.thumb.jpg.26bb1d824a7134a4e71ad

 

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

Может у кого-нибудь будут мысли по этому поводу, может я велосипед изобретаю? Перечитал наискосок много тем на форумах, включая те что на не родном языке, но пока ничего подходящего не нашел. По беглому взгляду видно что тут на форуме люди с головой, а я пока новичок, буду ждать хороших идей.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Парочку отгоняющих вопросов:

1. желаемое фпс 

2 нужно находить точное положение светодиода в каждом кадре, или можно выдавать положение один раз в секунду например

3 когда светодиод не горит камера его нормально видит или нет

4 примерная производительность железа

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. Должно быть в реальном времени.

2. Нужно находить его положение хотя бы 10 раз в секунду.

У нас 100фпс видео потока, светодиод мерцает чуть меньше 20 раз в секунду. Подходящий набор с кадром в котором светодиод горит и кадром где он погас - это каждые 5 кадров.

Так подобрал, поскольку если светодиод близко, то из этого набора 2-3 кадра можно выкинуть. Пол кадра с горящим светодиодом и пол с потухшим. Иногда границу затухания видно на 2  последовательных кадрах - на одном внизу, на другом сверху. Камера не одновременно весь кадр захватывает, а постепенно сверху вниз и получается штука на подобии 3-й картинки в начале темы.

3. Светодиод в потухшем состоянии при небольшом расстоянии от камеры(до 2-3х метров) можно различить на снимке. Дальше очень врятли.

Качество кадров так себе, при высоком фпс камера может гнать только в сжатом MJPG формате.

4. Должно работать на ODROID-XU3 Lite У него 4-х ядерный ARM Exynos5422 1.8ГГц. Есть аппаратный JPG кодер/энкодер и подобие видеокарты в виде Mali-T628 MP6. Ну и 2Гб LPDDR3 933MHz. Линукс всем заправляет. Opencv версии 2.4.11 Ставил через боль и страдание, а перейти на 3-й пока нервов не хватает:) А вообще для ускорения процесса сначала пишу на компе, потом на одроиде пересобираю и почти всегда всё работает:)

С потоками я разобрался, можно задачу распределить. Сейчас один поток на захват, второй на обработку, а третий за ними следит - запускает другие выводит отладочную ин-фу и завершает программу. Если что-то сложное делать, то можно перейти на 320x240, этого достаточно.

Ещё хотел добавить что находить метку нужно в диапазоне от практически упираясь в неё до примерно 10м на улице. По этому и хотел наделить её какими-нибудь уникальными свойствами типа моргания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Исходя из железа можно сразу исключить все варианты классификаторов. Так как основная черта искомого объекта это его мерцания, то логично что поиск надо производить не в статике а в динамике. Я бы попробовал следующее:

1 Найти оптический поток что бы нивелировать движение камеры и объектов на сцене (можно выделить в отдельный поток)

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

3 Фильтруем полученные данные по критерию: период мерцания, линейность движения

5 Так как нормально отфильтровать можно ну хотя бы с лагом в 5 мерцания (  а требованиях лаг должен быть 2 периода) , то экстрополируем движения траекторию движения что бы предсказать положение объекта в текущем кадре.

все кроме оптического потока железо точно потянет, хотя может и его уже ускорили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А нельзя использовать инфракрасный светодиод ?

Камера будет его видеть?

Если да, то надо поставить световой фильтр с полосой пропускания, лежащей в инфракрасном спектре.

Это позволило бы подчистить часть объектов.

Что я имею ввиду, можно почитать например здесь: http://13.gorod.tomsk.ru/index-1188407074.php

в статье на примере Cannon, но все верно и для вэбок.

 

Изменено пользователем Smorodov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за идею. Я про инфракрасный тоже думал, но ни фильтров, ни светодиодов под рукой не оказалось, а так бы попробовал. Остановило ещё то что Солнце в этом диапазоне тоже светит и судя по статье(кстати очень интересная статья) листва, почва и песок очень хорошо этот свет отражают, гораздо больше даже чем в видимом спектре и они будут ярко бликовать. Плюс цифровая матрица чувствительна к ближнему инфракрасному спектру в тысячи раз слабже чем к видимому, а увеличивать в тысячи раз выдержку и пропорционально уменьшать частоту съемки я не могу :(. Хорошо бы это дело проверить в живую, ведь характеристики китайской камеры могут отличаться от характеристики зеркальной камеры как в статье. Если найду фильтр, обязательно проверю. Если чувствительность камеры будет большой, то вся фильтрация ограничится трэшолдом)

По поводу предложения iksees - сейчас думаю над тем чтобы по оптическому потоку нивелировать смещение камеры. По сути задача стабилизации видео. В теории это сильно улучшит результат. Пока думаю как это сделать, поскольку с оптическим потоком ещё не имел дело) Нашёл какую то ин-фу по быстрому алгоритму Лукаса и ещё вариант с фазовой корреляцией по окну Ханна. Второй вариант вроде не даёт данных о вращении и изменении расстояния кадра, но с перемещением сцены работает не плохо. Попробую завтра Ханна прикрутить, он вроде по проще, и отпишусь. Застрял сейчас на том как сместить изображение. Банально и просто вроде, но с границей кадра не понятно что делать.

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

int main(int, char* [])
{
    // Создание видеопотока с камеры
    VideoCapture video(0);
    Mat frame, curr, prev, curr64f, prev64f, hann;
    int key = 0;

    do
    {
        video >> frame; // Очередной фрейм
        cvtColor(frame, curr, CV_BGR2GRAY); // Перевод в градации серого

        if(prev.empty())
        {
            prev = curr.clone(); // клонирование изображения
            createHanningWindow(hann, curr.size(), CV_64F); // Создание окна Ханна
        }

        prev.convertTo(prev64f, CV_64F);
        curr.convertTo(curr64f, CV_64F);

        Point2d shift = phaseCorrelate(prev64f, curr64f, hann); // Фазовая корреляция
        double radius = cv::sqrt(shift.x*shift.x + shift.y*shift.y); // Вычисление радиуса отклонения

        if(radius > 0)
        {
            // вывод на экран окружности и направления смещения
            Point center(curr.cols >> 1, curr.rows >> 1);
            cv::circle(frame, center, (int)radius, cv::Scalar(0, 255, 0), 3, CV_AA);
            cv::line(frame, center, Point(center.x + (int)shift.x, center.y + (int)shift.y), cv::Scalar(0, 255, 0), 3, CV_AA);
        }

        imshow("phase shift", frame);
        key = waitKey(2);

        prev = curr.clone();
    } while((char)key != 27); // Esc to exit...

    return 0;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Посмотрите еще phasecorrelate, функция помогает найти вектор смещения сцены.

http://recog.ru/blog/opencv/80.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Заказал ИК фильтр и светодиод подобрал, через месяц из Китая привезут. Если не сработает, то хоть инфракрасной фотографией займусь)

Посмотрите еще phasecorrelate, функция помогает найти вектор смещения сцены.

http://recog.ru/blog/opencv/80.html

Я чуть выше это и имел ввиду. Это кстати очень помогло.

Вот что без стабилизации видео было https://drive.google.com/file/d/0B2o_mPaDAC1HdFJBeGRtb3dtM1E/view?usp=sharing

А вот что со стабилизацией вышло https://drive.google.com/file/d/0B2o_mPaDAC1HUDF4UlpmSGxQbm8/view?usp=sharing

Теперь сцена видна только когда камера экспозицию меняет. Я наверно неудачно светодиод у окна положил, камера постоянно её меняла.

И вариант после трешолда и нахождения центра масс наибольшего связанного объекта. https://drive.google.com/file/d/0B2o_mPaDAC1HVXFDX3N1b0YwcEk/view?usp=sharing

Частенько вылетает шум всякий, особенно если светодиод не в кадре. По играю настройками фильтров, думаю получится по стабильнее сделать. Для большего расстояния, яркости светодиода не хватает.

Всё же не покидает чувство что что-то не так делаю или что-то можно было сделать проще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это обманчивое чувство :)

На начальном этапе все обычно очень просто, но сделать что то качественно (что угодно), на порядки сложнее.

Это еще очень даже простое решение, хороший результат был бы при использовании PTAM или DTAM :) но боюсь Ваше железо  не потянет.

PTAM:

 

 

DTAM:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это обманчивое чувство :)

На начальном этапе все обычно очень просто, но сделать что то качественно (что угодно), на порядки сложнее.

Это еще очень даже простое решение, хороший результат был бы при использовании PTAM или DTAM :) но боюсь Ваше железо  не потянет.

PTAM:

 

 

DTAM:

 

Имели мы дело с PTAM и DTAM и могу сказать, что это все полнейший отстой, который работает только при очень плавном перемещении камеры. Начинаешь резко ей махать и трекинг моментально умирает :-)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×