реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Нахождение истинного горизонта по снимку, нужен ли велосипед
DASM
сообщение Aug 13 2013, 16:32
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Есть снимок, как найти горизонт? Тупо фильтровать результат вычисления градиента? Гугл не словоохтлив на быстрые алгоритмы.
Go to the top of the page
 
+Quote Post
alexPec
сообщение Aug 13 2013, 18:17
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(DASM @ Aug 13 2013, 20:32) *
Есть снимок, как найти горизонт? Тупо фильтровать результат вычисления градиента? Гугл не словоохтлив на быстрые алгоритмы.

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

Ну а по быстрой реализации его - наверно стоит посмотреть openCV, на нем и реализовывал. Но в глубину не копал, насколько эффективно там все сделано. Работало, скорость устраивала. Но вся эта математика там сделана достаточно оптимально, дальнейшая оптимизация думаю эффективна только с привязкой к конкретной вычислительной платформе (распараллеливание).
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 13 2013, 18:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



C64x+ платформа. На поднятие в воздух в FPGA не хватит бензина и моих мозгов. В ар.дроне есть такая система, работает хорошо как я понял. было забавное видео, когда он пролетал возле высотки, и, когда она заняла большую часть поля зрения камеры, выровнил крен аккурат по ней =) Но потом задумался, не свалился.
Go to the top of the page
 
+Quote Post
alexPec
сообщение Aug 14 2013, 06:28
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



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


А размер кадра какой? Если большой - децимировать его в 320х240 и уж на такой то кадр C64 я думаю хватит всяко. Не обязательно в FPGA заталкивать.
Ну а насчет высотки - надо наверно все равно смотреть, за какое время, как резко меняется ошибка горизонта (опираясь на внутренний гироскоп). Если горизонт был горизонтальный и вдруг сразу стал вертикальный - фильтровать такие ситуации, не реагировать на вертикальный горизонт какое-то время, а если уж долго держится - ну значит уже мир перевернулся и надо приспосабливаться к его условиям...
Можно еще фильтровать например по показаниям остальных датчиков - акселерометра, магнитомера.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 14 2013, 07:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



В принципе размер любой, курсовую камеру можно как раз с небольшим разрешением и выбрать. Хотя и сенсоры с высоким разрешением умеют бинить в малое разрешение, так что не вопрос. Вопрос алгоритмов.
Go to the top of the page
 
+Quote Post
alexPec
сообщение Aug 14 2013, 08:48
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(DASM @ Aug 14 2013, 11:05) *
В принципе размер любой, курсовую камеру можно как раз с небольшим разрешением и выбрать. Хотя и сенсоры с высоким разрешением умеют бинить в малое разрешение, так что не вопрос. Вопрос алгоритмов.


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

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

PPS, кстати, он цветной, т.е. каждый цвет отдельно анализирует
Прикрепленные файлы
Прикрепленный файл  lapfilt.rar ( 2.14 мегабайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post
_pv
сообщение Aug 14 2013, 10:59
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



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

upd
вроде ничего так получается:

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 14 2013, 11:16
Сообщение #8


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



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

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

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

Возможно там, что -то найдете для себя полезное.


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
_pv
сообщение Aug 14 2013, 12:49
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



еще можно для каждого столбца тупо посчитать среднеквадратичное отклонение по пикселям в столбце сверху вниз (StDev(y0), StDev(y0;y1), StDev(y0;y1;y2), StDev(y0;y1;...;yn)), а затем тоже самое снизу вверх,
и за границу взять точку где их сумма будет минимальна. ну а потом опять линейный фит по всем столбцам.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 14 2013, 13:53
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



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

upd
вроде ничего так получается:

Прикрепленное изображение

Интереная идея. Получается в Матлабе или чем либо еще ?
Go to the top of the page
 
+Quote Post
_pv
сообщение Aug 14 2013, 15:42
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



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}]]

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 14 2013, 16:13
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



В самом деле, просто и вроде неплохо. Сдается мне в перевернувшемся квадрокоптере так и сделано. Но это редкость. Точность метода невысока, но когда у аппарата приличное ускорение с нынешними гироскопами потерять горизонт еще проще.
Go to the top of the page
 
+Quote Post
_pv
сообщение Aug 14 2013, 16:25
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



если сделать через минимум среднеквадратичного значения посчитанного сверху/снизу:
Код
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: тут косяк, только по одному цветовому каналу считается, исправлять уже лень.
Go to the top of the page
 
+Quote Post
DASM
сообщение Aug 14 2013, 18:20
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Что то меня цветовая идея вообще напрягает. Имхо это на ЧБ должно работать. А мысли в направлении поиска вектора смещения между соседними кадрами ? Правда тогда крен и тангаж начнут играть роль.
Go to the top of the page
 
+Quote Post
alexPec
сообщение Aug 14 2013, 19:43
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(_pv @ Aug 14 2013, 20:25) *
Прикрепленное изображение


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

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

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

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

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

PS вот еще вопрос, а если горизонт встал вертикально? Какая из половинок считается "небом" Которая голубее? sm.gif
PPS А если небо внизу?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 10th July 2025 - 13:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016