|
|
  |
Нахождение истинного горизонта по снимку, нужен ли велосипед |
|
|
|
Aug 13 2013, 18:17
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(DASM @ Aug 13 2013, 20:32)  Есть снимок, как найти горизонт? Тупо фильтровать результат вычисления градиента? Гугл не словоохтлив на быстрые алгоритмы. Вроде фильтром лапласа хорошо границы находятся. В свое время им достаточно хорошо выделял автомобильные номера на картинке. картинка типа такой получается: вотНу а по быстрой реализации его - наверно стоит посмотреть openCV, на нем и реализовывал. Но в глубину не копал, насколько эффективно там все сделано. Работало, скорость устраивала. Но вся эта математика там сделана достаточно оптимально, дальнейшая оптимизация думаю эффективна только с привязкой к конкретной вычислительной платформе (распараллеливание).
|
|
|
|
|
Aug 14 2013, 06:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(DASM @ Aug 13 2013, 22:55)  C64x+ платформа. На поднятие в воздух в FPGA не хватит бензина и моих мозгов. В ар.дроне есть такая система, работает хорошо как я понял. было забавное видео, когда он пролетал возле высотки, и, когда она заняла большую часть поля зрения камеры, выровнил крен аккурат по ней =) Но потом задумался, не свалился. А размер кадра какой? Если большой - децимировать его в 320х240 и уж на такой то кадр C64 я думаю хватит всяко. Не обязательно в FPGA заталкивать. Ну а насчет высотки - надо наверно все равно смотреть, за какое время, как резко меняется ошибка горизонта (опираясь на внутренний гироскоп). Если горизонт был горизонтальный и вдруг сразу стал вертикальный - фильтровать такие ситуации, не реагировать на вертикальный горизонт какое-то время, а если уж долго держится - ну значит уже мир перевернулся и надо приспосабливаться к его условиям... Можно еще фильтровать например по показаниям остальных датчиков - акселерометра, магнитомера.
|
|
|
|
|
Aug 14 2013, 08:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(DASM @ Aug 14 2013, 11:05)  В принципе размер любой, курсовую камеру можно как раз с небольшим разрешением и выбрать. Хотя и сенсоры с высоким разрешением умеют бинить в малое разрешение, так что не вопрос. Вопрос алгоритмов. Ну вот такой алгоритм есть (вложение). Там программка, если есть веб камера с WDM драйвером, то можете поиграться, фильтр лапласа в динамике. Нужно конечно под горизонт допилить, но как база мне кажется сойдет. Если надо - в личку, вышлю исходники. Прога использует dll-ы, от них тоже есть исходники. А вообще все это в openCV было, щас вроде из этого проекта коммерческий делают... PS программку под winXP сейчас проверил - работает на ноуте со встроенной камерой PPS, кстати, он цветной, т.е. каждый цвет отдельно анализирует
|
|
|
|
|
Aug 14 2013, 11:16
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 14 2013, 15:42
|
Гуру
     
Группа: Свой
Сообщений: 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}]]
|
|
|
|
|
Aug 14 2013, 16:25
|
Гуру
     
Группа: Свой
Сообщений: 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: тут косяк, только по одному цветовому каналу считается, исправлять уже лень.
|
|
|
|
|
Aug 14 2013, 19:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(_pv @ Aug 14 2013, 20:25)  Вообще, картинка то похожа на идеально круглого коня в вакууме  - в смысле условия почти идеальные, горизонт четко просматривается, есть явная линия, через весь кадр. А не пробовали подсунуть что-нибудь например с той же высоткой, или деревом до середины неба (т.е. до середины между верхним краем кадра и горизонтом)? Честно говоря мне не надо, но просто интересно... Цитата А мысли в направлении поиска вектора смещения между соседними кадрами ? А смысл? Только если кадр полностью меняется, но это просто взять картинку, развернувшись например на 180 град. Если уж в кадре что-то мешающее, то оно и в динамике мешать будет. Кстати, побаловался тут: 1-я картинка - просто заливка области цветом - берем нижние точки цвета и линейный фит 2-я картинка - Canny Edge Detector тоже самое - берем первые не черные точки (идем сверху) и линейный фит PS вот еще вопрос, а если горизонт встал вертикально? Какая из половинок считается "небом" Которая голубее?  PPS А если небо внизу?
Эскизы прикрепленных изображений
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|