powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / очень срочно и очень нужно
11 сообщений из 11, страница 1 из 1
очень срочно и очень нужно
    #34240245
liza23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, извините, что обращаюсь, но правда не знаю как сделать....вроде на вид все просто....но никак. Не удобно обращаться с "0", но я даже не знаю с чего начать, короче задача такая: "Распознавание образов. Выделение контура". Т.е., например, рисуем черный квадрат, после нажатия кнопки старт должен остаться только его контур. Заранее спасибо. Пишите на мыло lizik@itcwin.com или на асю 163507500
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34240261
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
liza23Здравствуйте, извините, что обращаюсь, но правда не знаю как сделать....вроде на вид все просто....но никак. Не удобно обращаться с "0", но я даже не знаю с чего начать, короче задача такая: "Распознавание образов. Выделение контура". Т.е., например, рисуем черный квадрат, после нажатия кнопки старт должен остаться только его контур. Заранее спасибо. Пишите на мыло lizik@itcwin.com или на асю 163507500

А на чем надо реализовывать? В какой среде? Есть ли хотя бы какие нибудь наметки камими методами это надо сделать? Если это дипломный проект, то могут потребовать реализовать и через нейронные сети, а если же нет, то алгоритмы могут быть и попроще. Напишите, более конкретные условия выполнения данной задачи.
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34240263
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
liza23 ....но никак ..Распознавание образов.

Действительно... никак. Потому-что этой демой занимаются целые исследовательские институты и пишут большие и толстые диссертации.

И вот так вот... на пальцах вряд-ли кто-то обьяснит принцип. Особенно в форуме, посвященном клиент-серверным технологиям.

..Выделение контура..

Хм... а эта постановка намного проще. Выделение контура - стандарнтый фильтр многих графическиех редакторов. Поищите в интернете на тему "растровые фильтры".

И вообще. Определитесь с постановкой. Что вам нужно. Просто выделить контур? Или определить класс геометрической фигуры?
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34240295
liza23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А на чем надо реализовывать? В какой среде? Есть ли хотя бы какие нибудь наметки камими методами это надо сделать? Если это дипломный проект, то могут потребовать реализовать и через нейронные сети, а если же нет, то алгоритмы могут быть и попроще. Напишите, более конкретные условия выполнения данной задачи.[/quot]

просто в среде С++, все, что было сказано, еще преподаватель сказал, что программа займет всего 5 строчек, так, что я думаю..это самое простое, что может быть.....

P.S.-это не диплом...просто курсовик
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34240297
liza23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вообще. Определитесь с постановкой. Что вам нужно. Просто выделить контур? Или определить класс геометрической фигуры?

просто выделить контур
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34240430
Ионас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Распознать - значит узнать. Узнать является ли нечто контуром. Для этого нудны признаки. Что является признаком контура - его замкнутость. В простейшем виде (как видимо и хотел препод) нужно по отношению к предъявленной фигуре сделать вывод является лиьона контуром, т.е. замкнута ли она, т.е. да или нет. А здесь естественно будет работать конструкция if(условие) MessageBox("контур"); else MessageBox('не контур');
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34240459
Vidmak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача стоит в "Выделение контура"
Если мне не изминяет память, попробуйте применить на изображение маску примерно такого вида
0 -1 0
-1 3 -1
0 -1 0
Сам алгоритм сточек 5 займет как раз займет + почитать картинку + вывод на экран
А вообще можно залезть в Гугл и там поискать "Edge Detection" "Выделение контура"в
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34240561
Ионас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vidmak А вообще можно залезть в Гугл и там поискать "Edge Detection" "Выделение контура"в
Пока что непонятно, что ей задали. То ли отфильтровать, то ли распознать. Задачки ведь разные.
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34241248
liza23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[/quot]
Пока что непонятно, что ей задали. То ли отфильтровать, то ли распознать. Задачки ведь разные.[/quot]

....распознать, т.к. задача звучит как Распознавание образов.
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34241266
liza23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное, все вы знаете известный алгоритм "жука", (извините за глупость), но может просто сократить его?
Вот он:
Файл заголовка:
//---------------------------------------------------------------------------
#ifndef GraphicUnitH
#define GraphicUnitH
//---------------------------------------------------------------------------

#include <Graphics.hpp>

extern void AlgorithmBeatle(Graphics::TBitmap* FromImage,
Graphics::TBitmap* ToImage);
extern void AlgorithmScan(Graphics::TBitmap* FromImage,
Graphics::TBitmap* ToImage);

#endif

cpp файл:
//---------------------------------------------------------------------------
#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)
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];
}
}
}
}
}
// ---------------------------------------------------------------------------
void AlgorithmScan(Graphics::TBitmap* FromImage,
Graphics::TBitmap* ToImage)
{
// Тип ветви (левая или правая)
typedef enum {bLeft, bRight} TBranchType;

// Структура, описывающая ветвь
struct TBranch
{
TBranchType BranchType; // Тип ветви
TBranch* Branch; // Парная ветвь
};

// Структура, описывающая строку
struct TString
{
int BeginX; // Начало черной серии
int EndX; // Конец черной серии
TBranch* Branch; // Указатель на структуру ветви
};

// Возможные ситуации
typedef enum {
sBegin, // Начало
sNext, // Продолжение
sBranch, // Ветвление
sFusion, // Слияние
sEnd // Конец
} TSituation;

// Сканируемая полоса
struct TLine
{
Byte* L1; // Верхняя линия
Byte* L2; // Нижняя линия
};

int Y; // Текущая координата Y
int X; // Текущая координата X
int cX; // Временная координата X для сканирования
TLine Line; // Сканируемая полоса
TSituation CurrentSituation; // Текущая ситуация

for (Y = 0; Y < FromImage->Height; Y++)
{
Line.L1 = (Byte*)FromImage->ScanLine[Y];
Y++;
Line.L2 = (Byte*)FromImage->ScanLine[Y];

// Пробуем выявить ситуации:
// Ищем первый черный элемент во второй линии сканируемой полосы
for (X = 0; X < FromImage->Width; X++)
{
if (Line.L2[X] < 255)
{
// Если черный элемент найден, пытаемся уточнить ситуацию
CurrentSituation = sBegin;
for (cX = X; cX < FromImage->Width; cX++)
{


}

}
}

}

}
...
Рейтинг: 0 / 0
очень срочно и очень нужно
    #34241384
liza23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...хотя проще новую написать
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / очень срочно и очень нужно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]