Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распознавание геометрических фигур на плоскости 
:(
    Опции темы
DragonFire
Дата 7.11.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Ну поделись)) в 2х словах)) вдруг кому-то понадобиться))


--------------------
PM MAIL ICQ   Вверх
SHShadow
Дата 16.11.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.11.2004

Репутация: нет
Всего: нет



Обещал же поделиться, а сам молчит. Ну же.
PM MAIL   Вверх
SHShadow
  Дата 20.11.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 25.11.2004

Репутация: нет
Всего: нет



Есть у меня один алгорим по определению объектов методом жука. Выкладываю на обозрение. Правда на оптимальность не претендую:
Код

                Current=Start;
                int Direction=DIR_BOTTOM;
                if ((pDoc->m_imgMain.GetPixel(Current.x-1,Current.y-1)==RGB(255,255,255))&&
                    (pDoc->m_imgMain.GetPixel(Current.x,Current.y-1)==RGB(255,255,255))&&
                    (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y-1)==RGB(255,255,255))&&
                    (pDoc->m_imgMain.GetPixel(Current.x-1,Current.y)==RGB(255,255,255))&&
                    (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y)==RGB(255,255,255))&&
                    (pDoc->m_imgMain.GetPixel(Current.x-1,Current.y+1)==RGB(255,255,255))&&
                    (pDoc->m_imgMain.GetPixel(Current.x,Current.y+1)==RGB(255,255,255))&&
                    (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y+1)==RGB(255,255,255))) break;
                do
                {

                    switch(Direction)
                    {
                    case DIR_BOTTOM:
                        while((pDoc->m_imgMain.GetPixel(Current.x-1,Current.y)==RGB(255,255,255))&&
                            (pDoc->m_imgMain.GetPixel(Current.x,Current.y+1)!=RGB(255,255,255))) 
                        {

                            if (Current.y+1==Heigth) break;
                            Current.y++;
                            
                        }
                        if (Start==Current) break;
                        if (pDoc->m_imgMain.GetPixel(Current.x-1,Current.y)!=RGB(255,255,255)) {Current.x--;Direction=DIR_LEFT;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y)!=RGB(255,255,255)) {Current.x++;Current.y;Direction=DIR_RIGTH;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x-1,Current.y+1)!=RGB(255,255,255)) {Current.x--;Current.y++;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y+1)!=RGB(255,255,255)) {Current.x++;Current.y++;}
                        else Direction=DIR_UP;
                        if (Current.y>Bottom) Bottom=Current.y;
                        break;
                    case DIR_RIGTH:
                        while((pDoc->m_imgMain.GetPixel(Current.x,Current.y+1)==RGB(255,255,255))&&
                            (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y)!=RGB(255,255,255))) 
                        {
                            if (Current.x+1==Width) break;
                            Current.x++;
                            
                        }
                        if (Start==Current) break;
                        if (pDoc->m_imgMain.GetPixel(Current.x,Current.y+1)!=RGB(255,255,255)) {Current.y++;Direction=DIR_BOTTOM;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x,Current.y-1)!=RGB(255,255,255)) {Current.y--;Direction=DIR_UP;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y-1)!=RGB(255,255,255)) {Current.x++;Current.y--;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y+1)!=RGB(255,255,255)) {Current.x++;Current.y++;}
                        else Direction=DIR_LEFT;
                        if (Current.x>Rigth) Rigth=Current.x;
                        break;
                    case DIR_UP:
                        while((pDoc->m_imgMain.GetPixel(Current.x+1,Current.y)==RGB(255,255,255))&&
                            (pDoc->m_imgMain.GetPixel(Current.x,Current.y-1)!=RGB(255,255,255))) 
                        {
                            Current.y--;
                            if (Current.y==0) break;
                        }
                        if (Start==Current) break;
                        if (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y)!=RGB(255,255,255)) {Current.x++;Direction=DIR_RIGTH;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x-1,Current.y)!=RGB(255,255,255)) {Current.x--;Direction=DIR_LEFT;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x+1,Current.y-1)!=RGB(255,255,255)) {Current.x++;Current.y--;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x-1,Current.y-1)!=RGB(255,255,255)) {Current.x--;Current.y--;}
                        else Direction=DIR_BOTTOM;
                        if (Current.y<Top) Top=Current.y;
                        break;
                    case DIR_LEFT:
                        while((pDoc->m_imgMain.GetPixel(Current.x,Current.y-1)==RGB(255,255,255))&&
                            (pDoc->m_imgMain.GetPixel(Current.x-1,Current.y)!=RGB(255,255,255))) 
                        {
                            Current.x--;
                            if (Current.x==0) break;
                        }
                        if (Start==Current) break;
                        if (pDoc->m_imgMain.GetPixel(Current.x,Current.y-1)!=RGB(255,255,255)) {Current.y--;Direction=DIR_UP;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x,Current.y+1)!=RGB(255,255,255)) {Current.y++;Direction=DIR_BOTTOM;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x-1,Current.y+1)!=RGB(255,255,255)) {Current.x--;Current.y++;}
                        else if (pDoc->m_imgMain.GetPixel(Current.x-1,Current.y-1)!=RGB(255,255,255)) {Current.x--;Current.y--;}
                        else Direction=DIR_RIGTH;
                        if (Current.x<Left) Left=Current.x;
                        break;
                    default :MessageBox("Ошибка направления обхода."); return;
                        break;
                    }

                }while (Start!=Current);


pDoc->m_imgMain это CImage объект
Left, Rigth, Top, Bottom - координаты определенного объекта (описывающего квадрата)

количество углов будет равно числу проходов цикла + 1.

PM MAIL   Вверх
Paguo86PK
  Дата 5.3.2011, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.4.2010
Где: Tashkent

Репутация: нет
Всего: нет



Поиски в гугле про оконтуровании объектов изображения чаще приводят к фильтрам с матрицами 3x3 на каждый пиксел. Что совсем не подходит из-за сильного снижения скорости. Тем более весь этот массив координат пограничных пикселей потом очень трудоёмко отсортировать в многоугольник с линейным расположением координат, чтобы Polygon выглядил действительно как контур, а не паутина.
Достаточно долго и упорно я работал над собственным алгоритмом, основой которого стал "бот" бегущий вдоль границы и тянущий за собой стройный ряд координат. Основой поведения "бота" стала таблица постулатов. Однако, я столкнулся с огромными проблемами в сложных объектах, где происходили сбои.

Логика "жука"(бота) моего алгоритма строится так:
A) Жук может ползти в одном из восьми направлений, кратному 45°;
B) Жук имеет пять сенсоров(усиков) для получения сведений об окружающем пространстве. Все они собирают информацию о пяти соседних клетах по направлениям W,NW,N,NE,E (З,СЗ,С,СВ,В) относительно направления движения;
C) Имеется таблица, где перечисляются все возможные постулаты, в соответствии состояний пяти усиков жука в каком направлении он должен развернуться.

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

Ниже привожу этот алгоритм. Может кого-то он заинтересует, кому-то будет полезен. Ну а кто-нибудь поможет доработать.

Работает так: Вначале строится фигура (параметры можно менять в теле алгоритма в секции WM_CREATE) в Bitmap 640x480 32bpp и выводится на экран. Далее, клавиша ПРОБЕЛ делает один шаг "жука". Причём справа-вверху отображается Zoom региона с жуком, а справа-внизу выводятся пять Check-Box'ов - "усиков" жука. Галочкой помечается текущая обстановка, а серостью - предыдущее. В центре - Hex-код предыдущей и текущей ситуации. Всё это нужно для отладки и построения кодов таблицы постулатов.
Клавиша ENTER делает серию шагов, а ESC бежит до тех пор, пока контур не замкнётся.
Ну, в самом начале можете смело нажать на ESC и получить контур, так-как всё исправно сработает. Однако, если геометрию фигуры изменить, придётся "отлаживать" от проскоков и зацикливания.

Присоединённый файл ( Кол-во скачиваний: 43 )
Присоединённый файл  SideBar.zip 20,24 Kb
PM MAIL WWW   Вверх
Snakedon
Дата 26.5.2016, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.5.2016

Репутация: нет
Всего: нет



 У меня диплом на похожую тему) )и чесно говоря не оч понимаю как реализовать разпознавание просто фигур нейронной сетью)
PM MAIL   Вверх
Bitter
Дата 26.5.2016, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



Snakedon, так же как и распознавание рукописных букв, примеров которых полно
PM MAIL ICQ Skype   Вверх
Google
  Дата 17.11.2019, 00:44 (ссылка)  





  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.3651 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.