Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
starkan007
0 / 0 / 0
Регистрация: 29.04.2010
Сообщений: 2
#1

Посоветуйте как доработать код "Метод жука" для нахождения всех объектов на картинке - C++

03.05.2010, 23:37. Просмотров 2435. Ответов 0
Метки нет (Все метки)

У меня дана картинка на ней несколько треугольнико надо написать программу которая находит эти треугольники!!! Я реализовал это методом жука на С++ вот только проблема он находит первый треугольник и заканчивает поиск!!! помогите реализовать чтобы поиск не заканчивался и он находил остальные треугольники и обрисовывал их контур!!!
вот код:
/ Листинг 4. Модуль выделения контуров (cpp file)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "GraphicUnit.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
 
#include <Sysutils.hpp>
 
/*
 Отслеживающий алгоритм выделения контуров
 "Алгоритм жука"
*/
 
void AlgorithmBeatle(Graphics::TBitmap* FromImage,
                     Graphics::TBitmap* ToImage)
{
 typedef enum {North, East, South, West} TDirectional;
 int X,Y;                 // Координаты первой встречи с объектом
 int cX,cY;               // Текущие координаты маркера
 Byte *Line, *ToLine;     // Обрабатываемые линии
 Byte B;                  // Значение текущего пиксела
 TDirectional Direct;     // Направление движения жука
 
 // Идем до тех пор, пока не встретим черную область
 for (Y = 0; Y < FromImage->Height; Y++)
 
 {
  Line = (Byte*)FromImage->ScanLine[Y];
  for (X = 0; X < FromImage->Width; X++)
  {
   B = Line[X];
   if (B == 255)   //black
    break;
  }
 
  // Если встречен объект, отличающийся от цвета фона (255 - белый)
  // прервать поиск
  if (X != FromImage->Width)
   break;
 }
 
 // Если не нашли ни одного черного пиксела, то выходим из процедуры
 if ((X == FromImage->Width) && (Y == FromImage->Height))
  return;
 
 // Если все нормально, начинаем обход по алгоритму жука
 ToLine = (Byte*)ToImage->ScanLine[Y];
 ToLine[X] = 0;
 
 // Поворачиваем налево (новое направление - север)
 cX = X;
 cY = Y - 1;
 Direct = North;
 Line = (Byte*)FromImage->ScanLine[cY];
 
 // Пока не придем в исходную точку, выделяем контур объекта
 while ((cX != X) || (cY != Y))
 {
  // В зависимости от текущего направления движения жука
  switch (Direct)
  {
    // Север
   case North:
   {
    B = Line[cX];
    // Если элемент "черный", поворачиваем снова "налево"
    if (B < 255)
    {
     ToLine = (Byte*)ToImage->ScanLine[cY];
     ToLine[cX] = 0;
     Direct = West;
     cX--;
    }
    // Иначе поворачиваем "направо"
    else
    {
     Direct = East;
     cX++;
    }
   }
   break;
 
   // Восток
   case East:
   {
    B = Line[cX];
    // Если элемент "черный", поворачиваем снова "налево"
    if (B < 255)
    {
     ToLine = (Byte*)ToImage->ScanLine[cY];
     ToLine[cX] = 0;
     Direct = North;
     cY--;
     Line = (Byte*)FromImage->ScanLine[cY];
    }
    // Иначе поворачиваем "направо"
    else
    {
     Direct = South;
     cY++;
     Line = (Byte*)FromImage->ScanLine[cY];
    }
   }
   break;
 
   // Юг
   case South:
   {
    B = Line[cX];
    // Если элемент "черный", поворачиваем снова "налево"
    if (B < 255)
    {
     ToLine = (Byte*)ToImage->ScanLine[cY];
     ToLine[cX] = 0;
     Direct = East;
     cX++;
    }
    // Иначе поворачиваем "направо"
    else
    {
     Direct = West;
     cX--;
    }
   }
   break;
 
   // Запад
   case West:
   {
    B = Line[cX];
    // Если элемент "черный", поворачиваем снова "налево"
    if (B < 255)
    {
     ToLine = (Byte*)ToImage->ScanLine[cY];
     ToLine[cX] = 0;
     Direct = South;
     cY++;
     Line = (Byte*)FromImage->ScanLine[cY];
    }
    // Иначе поворачиваем "направо"
    else
    {
     Direct = North;
     cY--;
     Line = (Byte*)FromImage->ScanLine[cY];
    }
    }
   }
       }
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2010, 23:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Посоветуйте как доработать код "Метод жука" для нахождения всех объектов на картинке (C++):

Создать классы "Computer", "Software", "User" и реализовать взаимодействие объектов этих типов между собой - C++
Помогите решить задачку,нужна в инст на экзамен. Составить программу реализующую: 1)классы,которые могут содержать...

Где ошибка невозможно преобразовать указатель "this" из "const pers" в "pers &" при выводе объектов через cout - C++
Добрый день! Переписал код из книг Лафоре, создание мультимножества из собственных объектов- справочник телефонный, с именем и фамилией. ...

Как принять код клавиши, а вписать саму клавишу? (Принимает "57", что означает "9") - C++
Нужно избавиться от такой глупости: char ch = 0; if(ch=='1')mas=1; if(ch=='2')mas=2; if(ch=='3')mas=3; ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Как, каким образом "скомпилировать" код для С или С++? - C++
Как, каким образом &quot;скомпилировать&quot; код для С или С++? Как лучше всего это сделать?

Как дописать код для полного функционирования? Структура "Студент" - C++
все в принципе работает с одним студентом,но есть загвоздка,если ставишь больше то он ответы выдает на первого правильно а на других как...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 23:37
Привет! Вот еще темы с ответами:

"Неожиданный" пропуск ввода при заполнении пользователем полей в массиве объектов типа "Student" - C++
Здравствуйте. Решил создать небольшой класс &quot;Студент&quot; с массивом объектов. При первом прохождении цикла (для object) все работает хорошо,...

Проверьте код,"численные методы,метод трапеций" - C++
Помогите,тут немного не такая формула,как сделать чтобы брался i-1 элемент функции слаживался с f(x) iым делился на два и умножался на...

Исправить код С++ "Метод Гаусса с выбором главного элемента по строке" - C++
В данном коде есть где-то ошибки,помогите пожалуйста их найти #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include...

Посоветуйте пожалуйста литературу по С++ для начинающих,желательно с пометкой "для тупых" - C++
Нужна подробная литература по изучению С++,где было бы подробное объяснение каждого шага,наподобие книги &quot;Изучаем HTML,XHTML и CSS&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru