Форум программистов, компьютерный форум CyberForum.ru

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

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

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

03.05.2010, 23:37. Просмотров 2208. Ответов 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];
    }
    }
   }
       }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2010, 23:37     Посоветуйте как доработать код "Метод жука" для нахождения всех объектов на картинке
Посмотрите здесь:
C++ Создать классы "Computer", "Software", "User" и реализовать взаимодействие объектов этих типов между собой
C++ Как принять код клавиши, а вписать саму клавишу? (Принимает "57", что означает "9")
Как, каким образом "скомпилировать" код для С или С++? C++
Как дописать код для полного функционирования? Структура "Студент" C++
"Неожиданный" пропуск ввода при заполнении пользователем полей в массиве объектов типа "Student" C++
Проверьте код,"численные методы,метод трапеций" C++
C++ Исправить код С++ "Метод Гаусса с выбором главного элемента по строке"
C++ Разработать класс "Массив больших чисел", который состоит из объектов класса "Большие целые числа". Найти сумму элементов массива.
C++ Посоветуйте пожалуйста литературу по С++ для начинающих,желательно с пометкой "для тупых"
Реализация перегрузки "operator +" для двух объектов C++
C++ Перегрузка "оператора +" для сложения массива объектов
C++ Описать класс "Контейнер" как объект, предназначенный для транспортировки классов "Строительных блоков"

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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