Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нахождение истинного горизонта по снимку
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
DASM
Есть снимок, как найти горизонт? Тупо фильтровать результат вычисления градиента? Гугл не словоохтлив на быстрые алгоритмы.
alexPec
Цитата(DASM @ Aug 13 2013, 20:32) *
Есть снимок, как найти горизонт? Тупо фильтровать результат вычисления градиента? Гугл не словоохтлив на быстрые алгоритмы.

Вроде фильтром лапласа хорошо границы находятся. В свое время им достаточно хорошо выделял автомобильные номера на картинке.
картинка типа такой получается:
вот

Ну а по быстрой реализации его - наверно стоит посмотреть openCV, на нем и реализовывал. Но в глубину не копал, насколько эффективно там все сделано. Работало, скорость устраивала. Но вся эта математика там сделана достаточно оптимально, дальнейшая оптимизация думаю эффективна только с привязкой к конкретной вычислительной платформе (распараллеливание).
DASM
C64x+ платформа. На поднятие в воздух в FPGA не хватит бензина и моих мозгов. В ар.дроне есть такая система, работает хорошо как я понял. было забавное видео, когда он пролетал возле высотки, и, когда она заняла большую часть поля зрения камеры, выровнил крен аккурат по ней =) Но потом задумался, не свалился.
alexPec
Цитата(DASM @ Aug 13 2013, 22:55) *
C64x+ платформа. На поднятие в воздух в FPGA не хватит бензина и моих мозгов. В ар.дроне есть такая система, работает хорошо как я понял. было забавное видео, когда он пролетал возле высотки, и, когда она заняла большую часть поля зрения камеры, выровнил крен аккурат по ней =) Но потом задумался, не свалился.


А размер кадра какой? Если большой - децимировать его в 320х240 и уж на такой то кадр C64 я думаю хватит всяко. Не обязательно в FPGA заталкивать.
Ну а насчет высотки - надо наверно все равно смотреть, за какое время, как резко меняется ошибка горизонта (опираясь на внутренний гироскоп). Если горизонт был горизонтальный и вдруг сразу стал вертикальный - фильтровать такие ситуации, не реагировать на вертикальный горизонт какое-то время, а если уж долго держится - ну значит уже мир перевернулся и надо приспосабливаться к его условиям...
Можно еще фильтровать например по показаниям остальных датчиков - акселерометра, магнитомера.
DASM
В принципе размер любой, курсовую камеру можно как раз с небольшим разрешением и выбрать. Хотя и сенсоры с высоким разрешением умеют бинить в малое разрешение, так что не вопрос. Вопрос алгоритмов.
alexPec
Цитата(DASM @ Aug 14 2013, 11:05) *
В принципе размер любой, курсовую камеру можно как раз с небольшим разрешением и выбрать. Хотя и сенсоры с высоким разрешением умеют бинить в малое разрешение, так что не вопрос. Вопрос алгоритмов.


Ну вот такой алгоритм есть (вложение). Там программка, если есть веб камера с WDM драйвером, то можете поиграться, фильтр лапласа в динамике. Нужно конечно под горизонт допилить, но как база мне кажется сойдет. Если надо - в личку, вышлю исходники. Прога использует dll-ы, от них тоже есть исходники. А вообще все это в openCV было, щас вроде из этого проекта коммерческий делают...

PS программку под winXP сейчас проверил - работает на ноуте со встроенной камерой

PPS, кстати, он цветной, т.е. каждый цвет отдельно анализирует
_pv
если допустить что камера всегда видит небо, по нескольким верхним строкам определить средний цвет неба, вычесть его из всей картинки (каждого пикселя), возвести в квадрат, сложить все цвета, для каждого столбца i посчитать "центр тяжести" Yi = Sum(y[j]*pixColor[j]) / Sum(pixColor[j]). ну и сделать линейный фит Yi от i.

upd
вроде ничего так получается:
Нажмите для просмотра прикрепленного файла
Maverick
Могу только помочь с литературой (прямого алгоритма не знаю):
1. Р. Гонсалес, Р. Вудс Цифровая обработка изображений — М: Техносфера, 2005 – 1007с
2. Кудрявцев Л.В. Краткий курс математического анализа – M.: Наука, 1989 – 736с
3 . Анисимов Б.В. Распознавание и цифровая обработка изображений – М.: Высш. школа, 1983 – 295с
4. Я.Фурман Введение в контурный анализ. - Физматлит, 2003 -592с

+ этот источник(платный)
автореферат источника

набор интересных ссылок

Возможно там, что -то найдете для себя полезное.
_pv
еще можно для каждого столбца тупо посчитать среднеквадратичное отклонение по пикселям в столбце сверху вниз (StDev(y0), StDev(y0;y1), StDev(y0;y1;y2), StDev(y0;y1;...;yn)), а затем тоже самое снизу вверх,
и за границу взять точку где их сумма будет минимальна. ну а потом опять линейный фит по всем столбцам.
DASM
Цитата(_pv @ Aug 14 2013, 14:59) *
если допустить что камера всегда видит небо, по нескольким верхним строкам определить средний цвет неба, вычесть его из всей картинки (каждого пикселя), возвести в квадрат, сложить все цвета, для каждого столбца i посчитать "центр тяжести" Yi = Sum(y[j]*pixColor[j]) / Sum(pixColor[j]). ну и сделать линейный фит Yi от i.

upd
вроде ничего так получается:
Нажмите для просмотра прикрепленного файла

Интереная идея. Получается в Матлабе или чем либо еще ?
_pv
mathematica:
CODE
img = Import["d:\\tmp\\hor\\images.bmp"]
data = ImageData[img];
size = ImageDimensions[img]
sky = Table[Mean[Flatten[data[[1 ;; 20, ;; , c]]]], {c, 1, 3}]
Graphics[{RGBColor[sky], Disk[]}]
diff = Table[Norm[data[[y, x]] - sky]^2, {y, size[[2]]}, {x, size[[1]]}];
Image[diff]
horData = Table[{x, Sum[y*diff[[y, x]], {y, size[[2]]}]/Sum[diff[[y, x]], {y, size[[2]]}]}, {x, size[[1]]}];
hor = Fit[horData, {1, x}, x];
Show[img, ListPlot[Table[horData[[n]]*{1, -1} + {0, size[[2]]}, {n, size[[1]]}]], Plot[size[[2]] - hor, {x, 1, size[[1]]}, PlotStyle -> {Red, Thick}]]

Нажмите для просмотра прикрепленного файла
DASM
В самом деле, просто и вроде неплохо. Сдается мне в перевернувшемся квадрокоптере так и сделано. Но это редкость. Точность метода невысока, но когда у аппарата приличное ускорение с нынешними гироскопами потерять горизонт еще проще.
_pv
если сделать через минимум среднеквадратичного значения посчитанного сверху/снизу:
Код
horStDevData = Table[size[[2]] - Ordering[Table[StandardDeviation[Flatten[data[[1;; y + 1, x, col]]]]^2 + StandardDeviation[Flatten[data[[y;; size[[2]], x, col]]]]^2, {y, 1, size[[2]] - 1}], 1][[1]], {x, size[[1]]}];

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

upd: тут косяк, только по одному цветовому каналу считается, исправлять уже лень.
DASM
Что то меня цветовая идея вообще напрягает. Имхо это на ЧБ должно работать. А мысли в направлении поиска вектора смещения между соседними кадрами ? Правда тогда крен и тангаж начнут играть роль.
alexPec
Цитата(_pv @ Aug 14 2013, 20:25) *


Вообще, картинка то похожа на идеально круглого коня в вакууме sm.gif - в смысле условия почти идеальные, горизонт четко просматривается, есть явная линия, через весь кадр. А не пробовали подсунуть что-нибудь например с той же высоткой, или деревом до середины неба (т.е. до середины между верхним краем кадра и горизонтом)?
Честно говоря мне не надо, но просто интересно...

Цитата
А мысли в направлении поиска вектора смещения между соседними кадрами ?

А смысл? Только если кадр полностью меняется, но это просто взять картинку, развернувшись например на 180 град. Если уж в кадре что-то мешающее, то оно и в динамике мешать будет.

Кстати, побаловался тут:

1-я картинка - просто заливка области цветом - берем нижние точки цвета и линейный фит
2-я картинка - Canny Edge Detector тоже самое - берем первые не черные точки (идем сверху) и линейный фит

PS вот еще вопрос, а если горизонт встал вертикально? Какая из половинок считается "небом" Которая голубее? sm.gif
PPS А если небо внизу?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.