Белорусский Государственный Университет Информатики и Радиоэлектроники.
Контрольная работа
по дисциплине
«МАГИ»
«Программа распознавания символов»
Выполнил студент группы 500501
Балахонов Е.В.
Задание.Требуется написать программу, способную распознавать графически представленные символы в виде растрового изображения и преобразовывать в обычный текст.
- платформа: Win32,
- формат графического изображения: Windows Bitmap (BMP), 8 бит,
- шрифт для распознавания: Arial, 16
Выбор средств разработки.В качестве среды разработки будет использоваться Borland C++ Builder 5.
Распознавание символов.В качестве алгоритма выделения контуров будем использовать алгоритм жука.
Отслеживающие алгоритмы основаны на том, что на изображении отыскивается объект (первая встретившаяся точка объекта) и контур объекта отслеживается и векторизуется. Достоинством данных алгоритмов является их простота, к недостаткам можно отнести их последовательную реализацию и некоторую сложность при поиске и обработке внутренних контуров. Пример отслеживающего алгоритма - "алгоритма жука" - приведен на рис. 5.12. Жук начинает движение с белой области по направлению к черной, Как только он попадает на черный элемент, он поворачивает налево и переходит к следующему элементу. Если этот элемент белый, то жук поворачивается направо, иначе - налево. Процедура повторяется до тех пор, пока жук не вернется в исходную точку. Координаты точек перехода с черного на белое и с белого на черное и описывают границу объекта.
На рис. 1 показана схема работы такого алгоритма.
Рис. 1. Схема работы отслеживающего алгоритма «жука».
При нахождении новой точки контура, рассчитывается расстояние между предыдущей найденной точкой и новой. Если оно превышает некоторую границу (по умолчанию в 5 единиц), она запоминается. К концу построения скелетной линии программа имеет массив координат вершин ломаной, которая является скелетной линией объекта.
После построения скелетной линии производится сравнение ее с списком шаблонов известных символов. При нахождении совпадения, программа записывает в строку найденный символ.
Исходный текст программы.//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include <fstream.h>
#include "ChildFormUnit.h"
#include "MainFormUnit.h"
#include "AverageFilterDialogFormUnit.h"
#include "OSRFormUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TChildForm *ChildForm;
TTemplates Templates;
//---------------------------------------------------------------------------
__fastcall TChildForm::TChildForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool __fastcall TChildForm::LoadImage(AnsiString FileName)
{
try
{
Image1->Picture->LoadFromFile(FileName);
}
catch (EInvalidGraphic& Exception)
{
AnsiString Error = "Ошибка загрузки файла изображения! Ошибка системы: ";
Error += Exception.Message;
MessageBox(this->Handle, Error.c_str(), "Ошибка", MB_OK | MB_ICONERROR);
return false;
}
if (Image1->Picture->Bitmap->PixelFormat != pf8bit)
{
MessageBox(Handle,"Такой формат файла пока не подерживается...",
"Слабоват я пока...",MB_OK | MB_ICONSTOP | MB_APPLMODAL);
return false;
}
return true;
}
//---------------------------------------------------------------------------
void __fastcall TChildForm::FormClose(TObject *Sender,
TCloseAction &Action)
{
MainForm->DeleteActiveChildForm();
}
//---------------------------------------------------------------------------
void __fastcall TChildForm::AverageFilter()
{
AverageFilterDialogForm = new TAverageFilterDialogForm(this);
if (AverageFilterDialogForm->ShowModal() == mrCancel)
{
delete AverageFilterDialogForm;
return;
}
int Value = atoi(AverageFilterDialogForm->Edit1->Text.c_str());
delete AverageFilterDialogForm;
Byte* PrevisionLine = NULL;
Byte* CurrentLine = NULL;
Byte* NextLine = NULL;
int I = 0, J = 0;
int Summ = 0;
for (I = 0; I <= Image1->Picture->Bitmap->Height - 1; I++)
{
CurrentLine = (Byte*)Image1->Picture->Bitmap->ScanLine[I];
for (J = 0; J <= Image1->Picture->Bitmap->Width - 1; J++)
{
Summ = 0;
Одними из наиболее популярных услуг на рынке IT-технологий являются создание и продвижение лендингов. Они способны положительно влиять на деятельность любого бизнес-проекта в интернете. Судя по многочисленным отзывам, заказавшие создание лендингов люди ни разу не пожалели о потраченных деньгах. Они вложили в будущее, которое неразрывно связано с интернетом. Всё больше и больше предпринимателей обращаются к услугам разных агентств, веб-студий, чтобы заказать создание лендинга у профессионалов.