Программа распознавания символов
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
Direct = West;
cX--;
// Может это самая левая координата?
if (MinX > cX)
MinX = cX;
}
// Иначе поворачиваем "направо"
else
{
Direct = East;
cX++;
if (MaxX < cX)
MaxX = cX;
}
}
break;
// Восток
case East:
{
B = Line[cX];
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
Direct = North;
cY--;
Line = (Byte*)FromImage->ScanLine[cY];
// Может это самая верхняя точка?
if (TopPoint.Y > cY)
{
TopPoint.Y = cY;
TopPoint.X = cX;
}
}
// Иначе поворачиваем "направо"
else
{
Direct = South;
cY++;
Line = (Byte*)FromImage->ScanLine[cY];
if (MaxY < cY)
MaxY = cY;
}
}
break;
// Юг
case South:
{
B = Line[cX];
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
Direct = East;
cX++;
if (MaxX < cX)
MaxX = cX;
}
// Иначе поворачиваем "направо"
else
{
Direct = West;
cX--;
// Может это самая левая координата?
if (MinX > cX)
MinX = cX;
}
}
break;
// Запад
case West:
{
B = Line[cX];
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
Direct = South;
cY++;
Line = (Byte*)FromImage->ScanLine[cY];
if (MaxY < cY)
MaxY = cY;
}
// Иначе поворачиваем "направо"
else
{
Direct = North;
cY--;
Line = (Byte*)FromImage->ScanLine[cY];
// Может это самая верхняя точка?
if (TopPoint.Y > cY)
{
TopPoint.Y = cY;
TopPoint.X = cX;
}
}
}
}
}
TopPoint.X++;
if ((!TopPoint.X) && (!TopPoint.Y))
{
TopPoint.X = X;
TopPoint.Y = Y;
}
else
{
X = TopPoint.X;
Y = TopPoint.Y;
}
// Постройка скелета
ToLine = (Byte*)ToImage->ScanLine[Y];
ToLine[X] = 0;
// Поворачиваем налево (новое направление - юг)
cX = X;
cY = Y;
Vertex.X = X;
Vertex.Y = Y;
ShapeVector.push_back(Vertex);
Direct = East;
Line = (Byte*)FromImage->ScanLine[cY];
// Пока не придем в исходную точку, выделяем контур объекта
do
{
// В зависимости от текущего направления движения жука
switch (Direct)
{
// Север
case North:
{
B = Line[cX];
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
ToLine = (Byte*)ToImage->ScanLine[cY];
ToLine[cX] = 0;
Vertex.X = cX;
Vertex.Y = cY;
if (Distance(Vertex, ShapeVector[ShapeVector.size() - 1]) >=
Treshold)
ShapeVector.push_back(Vertex);
Direct = West;
cX--;
}
// Иначе поворачиваем "направо"
else
{
Direct = East;
cX++;
}
}
break;
// Восток
case East:
{
B = Line[cX];
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
ToLine = (Byte*)ToImage->ScanLine[cY];
ToLine[cX] = 0;
Vertex.X = cX;
Vertex.Y = cY;
if (Distance(Vertex, ShapeVector[ShapeVector.size() - 1]) >=
Treshold)
ShapeVector.push_back(Vertex);
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;
Vertex.X = cX;
Vertex.Y = cY;
if (Distance(Vertex, ShapeVector[ShapeVector.size() - 1]) >=
Treshold)
ShapeVector.push_back(Vertex);
Direct = East;
cX++;
}
// Иначе поворачиваем "направо"
else
{
Direct = West;
cX--;
}
}
break;
// Запад
case West:
{
B = Line[cX];
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
ToLine = (Byte*)ToImage->ScanLine[cY];
ToLine[cX] = 0;
Vertex.X = cX;
Vertex.Y = cY;
if (Distance(Vertex, ShapeVector[ShapeVector.size() - 1]) >=
Treshold)
ShapeVector.push_back(Vertex);
Direct = South;
cY++;
Line = (Byte*)FromImage->ScanLine[cY];
}
// Иначе поворачиваем "направо"
else
{
Direct = North;
cY--;
Line = (Byte*)FromImage->ScanLine[cY];
}
}
}
} while ((cX != X) || (cY != Y));
Vertex.X = X;
Vertex.Y = Y;
ShapeVector.push_back(Vertex);
ToImage->Canvas->Pen->Color = clRed;
ToImage->Canvas->MoveTo(ShapeVector[0].X, ShapeVector[0].Y);
for (UINT i = 1; i < ShapeVector.size(); i++)
{
ToImage->Canvas->LineTo(ShapeVector[i].X, ShapeVector[i].Y);
}
for (UINT i = 0; i < ShapeVector.size(); i++)
{
ShapeVector[i].X -= MinX;
ShapeVector[i].Y -= Y;
}
/*
if (Symb == 'Й')
{
Symb++;
}
if (Symb == 'а')
{
// Symb = 'A';
break;
}
if ((Symb != 'Ы') && (!SkipMode))
{
AnsiString FileName = ExtractFilePath(Application->ExeName) + "TPL";
FileName += Symb;
ofstream OutFile(FileName.c_str());
for (UINT i = 0; i < ShapeVector.size(); i++)
{
OutFile << IntToStr(ShapeVector[i].X).c_str() << endl;
OutFile << IntToStr(ShapeVector[i].Y).c_str() << endl;
}
OutFile.close();
Symb++;
}
else
{
if (SkipMode)
{
SkipMode = false;
Symb++;
}
else if (Symb == 'Ы')
SkipMode = true;
}
*/
TTemplate* Template = FindTemplate(ShapeVector);
if (Template)
Result += Template->Symb;
}
//OSRForm->Show();
delete OSRForm;
Memo1->Text = Result;
}
//--------------------------------------------------------------------------
-
TTemplate* FindTemplate(TShapeVector Vec)
{
TTemplate Template;
Template.Vec = Vec;
for (UINT i = 0; i < Templates.size(); i++)
{
if (Templates[i] == Template)
return &Templates[i];
}
return NULL;
}
| | скачать работу |
Программа распознавания символов |