Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
starkan007
1

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

03.05.2010, 23:37. Просмотров 3369. Ответов 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];
    }
    }
   }
       }
 
}
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2010, 23:37
Ответы с готовыми решениями:

Как заменить код "метод правых прямоугольников" на "метод трапеции" на примере данной программы
program lab3; uses Crt; var x, s, h, minlim, maxlim, funcabspog:real; prssedkey:char;...

Как написать регулярное выражение для выдергивания английских букв и символов: "+", ",", ":", "-", " ", "!", "?" и "."
Не могу ни как собразить как написать регулярное выражение для выдергивания английских букв и...

Как вернуть действие по умолчанию "открыть" для объектов "Папка с файлами"
Когда я пытаюсь открыть папку двойным щелчком, у меня появляется консоль. Оказалось, у меня так...

Как изменить код VBA для сортировки, минуя метод "Debug.Print"?
Здравствуйте! Прошу помощи. Есть интересная тема...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2010, 23:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Метод перебора для нахождения решения "Судоку"
Всем привет. Люди помогите пожалуйста, у меня курсовая на тему Метод перебора для нахождения...

"student" не содержит определения для "Name" и не был найден метод расширения "Name"
Здравствуйте. Помогите пожалуйста найти ошибку (&quot;student&quot; не содержит определения для &quot;Name&quot; и...

Описать класс "Сar" (легковой автомобиль), и метод для вывода всех его полей
помогите пожалуйста. Описать класс car (легковой автомобиль) с полями price (цена), power...

"List<DataTable>" не содержит определения для "Rows", и не удалось найти доступный метод расширения "Rows"
&quot;List&lt;DataTable&gt;&quot; не содержит определения для &quot;Rows&quot;, и не удалось найти доступный метод расширения...


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

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

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