throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
П.1.2. Файл «ParamCentriod.cpp»
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Seria.h"
#include "ParamCentroid.h"
#include "CentroidRelax.h"
#include "About.h"
#include <dir.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormParam *FormParam;
HDC dc;
//---------------------------------------------------------------------------
__fastcall TFormParam::TFormParam(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// Открытие входного файла и подготовка его к работе
//---------------------------------------------------------------------------
void __fastcall TFormParam::OpenBtnClick(TObject *Sender)
{
char buffer[MAXPATH];
if (OpenDialog1->Execute())
{
if (ExtractFileExt(OpenDialog1->FileName)==".bmp")
{
OpenBMP();
RelaxBtn->Enabled=true;
}
else
if (ExtractFileExt(OpenDialog1->FileName)==".fld")
{
OpenFLD();
RelaxBtn->Enabled=true;
}
else
Application->MessageBoxA("Недопустимый тип файла", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
}
}
//---------------------------------------------------------------------------
// Обработка нажатия кнопки "О программе..."
//---------------------------------------------------------------------------
void __fastcall TFormParam::AboutBtnClick(TObject *Sender)
{
FormAbout->Show();
}
//---------------------------------------------------------------------------
// Обработка нажатия кнопки "Релаксация"
//---------------------------------------------------------------------------
void __fastcall TFormParam::RelaxBtnClick(TObject *Sender)
{
string Name;
AnsiString FileSafeName;
int index;
if ((insideR && outsideR)&& (insideR <= outsideR))
{
for(int i=0;i<=exp;i++)
{
// показ имени открытого файла
FormParam->Caption=ExtractFileName("Обработка изображения....");
Imaging(insideR,outsideR);
// BEGIN DEBUG
dc=bmp->Canvas->Handle;
BitBlt(dc,0,0,Width,Height,bmp->Canvas->Handle,0,0,SRCCOPY);
// формирование имени файла
index=AnsiPos(ExtractFileExt(OpenDialog1->FileName),ExtractFileName(OpenDialog1->FileName));
Name = ExtractFileName(OpenDialog1->FileName).c_str();
Name = Name.substr(0,index-1);
Name = Name.substr(0,4)+"_" ; //вырезать первые 4 символа
FileSafeName=StrPas(Name.c_str()) + IntToStr(outsideR)+"_"+ IntToStr(insideR)+".bmp";
bmp->SaveToFile(FileSafeName);
// END DEBUG
insideR+=step;
outsideR+=step;
} // for
Application->MessageBoxA("Обработка завершена", "Информация", MB_OK | MB_ICONINFORMATION);
// показ имени открытого файла
FormParam->Caption=ExtractFileName(OpenDialog1->FileName);
}
else
Application->MessageBoxA("Внешний и внутренний радиусы заданы неверно", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
}
//---------------------------------------------------------------------------
// Создание формы
//---------------------------------------------------------------------------
void __fastcall TFormParam::FormCreate(TObject *Sender)
{
char buffer[MAXPATH];
RelaxBtn->Enabled=false;
bmp=new Graphics::TBitmap;
// получение текущей директории проекта
OpenDialog1->InitialDir=getcwd(buffer, MAXPATH);
step=0;
exp=0;
}
//---------------------------------------------------------------------------
// Обработка ввода внешнего радиуса
//---------------------------------------------------------------------------
void __fastcall TFormParam::OutsideREditChange(TObject *Sender)
{
outsideR=StrToIntDef(OutsideREdit->Text,0);
if (outsideR==0) OutsideREdit->Text='0';
if (outsideR>=25)
{
Application->MessageBoxA("Значение внешнего радиуса должно быть не более 24", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
OutsideREdit->Text='0';
}
}
//---------------------------------------------------------------------------
// Обработка ввода внутреннего радиуса
//---------------------------------------------------------------------------
void __fastcall TFormParam::InsideREditChange(TObject *Sender)
{
insideR=StrToIntDef(InsideREdit->Text,0);
if (insideR==0) InsideREdit->Text='0';
if (insideR>=25)
{
Application->MessageBoxA("Значение внутреннего радиуса должно быть не более 24", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
InsideREdit->Text='0';
}
}
//---------------------------------------------------------------------------
// Выделение памяти массиву ImArr
//---------------------------------------------------------------------------
void __fastcall TFormParam::ImArrTakeMemory( unsigned short int Width, unsigned short int Height)
{
if (ImArr!=NULL)
{
// удаляем предыдущий массив
for (int i=0;i<=LastWidth;i++)
delete[] ImArr[i];
delete[] ImArr;
}
LastWidth= Width;
// выделяем память
ImArr = new unsigned short int*[Width];
for (int i=0;i<=Width;i++)
ImArr[i] = new unsigned short int [Height];
// обнуление массива
for (int i=0;i<=Width;i++)
{
for (int j=0;j<=Height;j++)
{
ImArr[i][j]=0;
}
}
}
//---------------------------------------------------------------------------
// Выделение памяти массиву СкArr
//---------------------------------------------------------------------------
void __fastcall TFormParam::CrArrTakeMemory(unsigned short int Width, unsigned short int Height)
{
if (CrArr!=NULL)
{
// удаляем предыдущий массив
for (int i=0;i<=LastWidth;i++)
delete[] CrArr[i];
delete[] CrArr;
}
LastWidth= Width;
// выделяем память
CrArr = new unsigned short int*[Width];
for (int i=0;i<=Width;i++)
CrArr[i] = new unsigned short int [Height];
// обнуление массива
for (int i=0;i<=Width;i++)
{
for (int j=0;j<=Height;j++)
{
CrArr[i][j]=0;
}
}
}
//---------------------------------------------------------------------------
// Серия
//---------------------------------------------------------------------------
void __fastcall TFormParam::SeriaBtnClick(TObject *Sender)
{
FormSeria->Show();
}
//---------------------------------------------------------------------------
// Открытие файла *.bmp
//---------------------------------------------------------------------------
void TFormParam::OpenBMP()
{
bmp->LoadFromFile( OpenDialog1->FileName);
Width=bmp->Width;
Height=bmp->Height;
ImArrTakeMemory(Width,Height);
CrArrTakeMemory(Width,Height);
// Transform coordinate
for (int i=0;i<=Width;i++)
{
for (int j=0;j<=Height;j++)
{
ImArr[i][j]=bmp->Canvas->Pixels[i][bmp->Height-j];
}
}
// показ имени открытого файла
FormParam->Caption=ExtractFileName(OpenDialog1->FileName);
}
//---------------------------------------------------------------------------
// Открытие файла *.fld
//---------------------------------------------------------------------------
void TFormParam::OpenFLD()
{
FILE *InFile;
void *data;
//FFileName = ;
if((InFile=fopen(OpenDialog1->FileName.c_str(), "rb"))==NULL)
{
Application->MessageBoxA("Ошибка открытия файла", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
}
else
{
fread(&data,sizeof(unsigned short int),1, InFile);
Width=(unsigned short int)data;//ширина изображения
fread(&data,sizeof(unsigned short int),1, InFile);
Height=(unsigned short int)data;// длина изображения
ImArrTakeMemory(Width,Height);
CrArrTakeMemory(Width,Height);
for (int i=0;i<Width;i++)
{
for (int j=0;j<Height;j++)
{
fread(&data,sizeof(unsigned short int),1, InFile);
ImArr[i][j]=(unsigned short int)data;
} // for (j)
} // for (i)
// показ имени открытого файла
FormParam->Caption=ExtractFileName(OpenDialog1->FileName);
}
}
//---------------------------------------------------------------------------
// Закрытие программы
//---------------------------------------------------------------------------
void __fastcall TFormParam::FormClose(TObject *Sender,
TCloseAction &Action)
{
//освобождаем используемую память
if (Width!=0)
{
for (int i=0;i<=Width;i++)
{
delete[] ImArr[i];
delete[] CrArr[i];
}
delete[] ImArr;
delete[] CrArr;
}
delete(bmp);
FormSeria->Close();
}
//---------------------------------------------------------------------------
П.1.3.Файл «ParamCentriod.h»
//---------------------------------------------------------------------------
#ifndef ParamCentroidH
#define ParamCentroidH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TFormParam : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupRadius;
TLabel *Label1;
TEdit *OutsideREdit;
TLabel *Label2;
TEdit *InsideREdit;
TBitBtn *OpenBtn;
TBitBtn *RelaxBtn;
TOpenDialog *OpenDialog1;
TBitBtn *AboutBtn;
TBitBtn *SeriaBtn;
void __fastcall OpenBtnClick(TObject *Sender);
void __fastcall AboutBtnClick(TObject *Sender);
void __fastcall RelaxBtnClick(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall OutsideREditChange(TObject *Sender);
void __fastcall InsideREditChange(TObject *Sender);
void __fastcall SeriaBtnClick(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
int insideR;//внутренний
int outsideR;//внешний
public: // User declarations
// Global variable
unsigned short int **ImArr; // считанное изображение из файла *.bmp или *.mass
unsigned short int **CrArr; // массив кривизны
unsigned short int Width;
unsigned short int Height;
unsigned short int LastWidth;
int step;// шаг
int exp; // эксперименты
Graphics::TBitmap *bmp;
__fastcall TFormParam(TComponent* Owner);
void __fastcall ImArrTakeMemory( unsigned short int Width,unsigned short int Height);
void OpenBMP();
void OpenFLD();
void __fastcall CrArrTakeMemory(unsigned short int Width, unsigned short int Height); // выделение памяти динамическому массиву
};
//---------------------------------------------------------------------------
extern PACKAGE TFormParam *FormParam;
//---------------------------------------------------------------------------
#endif
П.1.4.Файл «CentriodRelax.cpp»
//---------------------------------------------------------------------------
#pragma hdrstop
#include "ParamCentroid.h"
#include "CentroidRelax.h"
// definitions
#define MASK_SIZE 24
#define PI 3.1415926535897932384626433832795
//---------------------------------------------------------------------------
COORDINATE FltArr[MASK_SIZE*MASK_SIZE]; // массив координат точек фильтра
int FltArr_index;
#pragma package(smart_init)
// Piksels Filter
void ClearFltArr(void);
//---------------------------------------------------------------------------
// Вычисление центра масс
//---------------------------------------------------------------------------
COORDINATE CentrMass(PIXEL CF)
{
COORDINATE P;
int M=0,Wx=0,Wy=0;
int Cx=0,Cy=0;
// работа с маской
for (int k=0;k<FltArr_index;k++)
{
M+= FormParam->ImArr[CF.x+FltArr[k].x][CF.y+FltArr[k].y]; // масса пикселей в фильтре
Wx+=(CF.x+FltArr[k].x)*FormParam->ImArr[CF.x+FltArr[k].x][CF.y+FltArr[k].y]; //веса пикселей по x
Wy+=(CF.y+FltArr[k].y)*FormParam->ImArr[CF.x+FltArr[k].x][CF.y+FltArr[k].y];//веса пикселей по y
}
// масса пикселей
M=M/255;
// масса пикселей по оси Ox
Wx=Wx/255;
// масса пикселей по оси Oy
Wy=Wy/255;
if (M!=0)
{
Cx=(int)Wx/M + 0.5;
Cy=Wy/M;
}
//центр масс
P.x=Cx;
P.y=Cy;
return P;
}
//--------------------------------------------------------------------------
// Вычисление кривизны в точке i,j
//--------------------------------------------------------------------------
int CentroidRelax(int i,int j,int insideR,int outsideR)
{ COORDINATE P;
double h;
int C;
PIXEL CF;
CF.mass=FormParam->ImArr[i][j];
if ((CF.mass==0)||(CF.mass==140))
return 140; // точка не на линии - фон цвет серый
else
{
CF.x=i;
CF.y=j;
P=CentrMass(CF);//определить координаты центра масс
// определить длину вектора h
h=sqrt(pow(P.x-CF.x,2.0)+pow(P.y-CF.y,2.0));
// вычислить кривизну для текущей точки изображения
//*100, потому что кривизна находится в промежутке [0;1)
C=(h/pow(insideR,2.0)+0.005)*100;
//C=h/insideR+0.5;
// сохранить в массив
}
return C;
}
//--------------------------------------------------------------------------
// Вычисление точек фильтра
//--------------------------------------------------------------------------
void RingFiltrPoint(int insideR,int outsideR)
{
float s;
ClearFltArr();
for(int i=-MASK_SIZE;i<=MASK_SIZE;i++)
{
for(int j=MASK_SIZE;j>=-MASK_SIZE;j--)
{
s=sqrt(i*i+j*j);
if ((s<=outsideR)&&(s>=insideR))
{
FltArr[FltArr_index].x=i;
FltArr[FltArr_index++].y=j;
}
} //for
} //for
}
//--------------------------------------------------------------------------
// Очистка массива точек фильтра
//--------------------------------------------------------------------------