Литература
Физический энциклопедический словарь / Гл. ред. А.М. Прохоров.- М.: Изд-во. "Советская энциклопедия", 1983.
Бакиров Т.С., Генералов В.М., Топорков В.С. Измерение вязкоупругих характеристик клетки с помощью неоднородного переменного электрического поля. // Биотехнология. - 1998. – N5. – С.88-96.
Гасс Г.В., Марголис Л.Б., Черномордик Л.В. Локальные деформации мембран эритроцитов в переменном электрическом поле // Биологические мембраны.- 1990.- Т.7, N.6.- C.547-659.
Генералов В.М., Бакиров Т.С., Дурыманов А.Г., Медведев А.А., Порываев В.Д., Топорков В.С., Тюников Г.И., Сергеев А.Н., Петрищенко В. И., Шишкина Л.Н., Фефелов О.В. Исследование вирус-клеточного взаимодействия методом диэлектрофореза. Доклады академии наук. 2002. Т.383. № 2. С. 256-259.
Кручинина MB., Курилович С.А., Паруликова М.В., Бакиров Т.С., Генералов В.М., Пак А.В., Звольский И.Л. Электрические и вязкоупругие свойства эритроцитов пациентов с диффузной патологией печени. Доклады академии наук 2005 т.401 N 5 С. 701-704.
Кручинина М.В., Курилович С.А., Громов А.А., Бакиров Т.С., Генералов В.М., Пак А.В. Электрические и вязкоупругие свойства клеток крови у больных с алкогольным поражением сердца и ишемической болезнью сердца. Материалы 1-й Междисциплинарного научный конгресса "Человек и алкоголь-2007". – С.-Петербург. – 2007. – С.101-102.
Приложение. Листинг программы, работа над кодом которой проводилась в ходе производственной практики.
// cellpaint.cpp : Defines the entry point for the application.
#include "stdafx.h"
#include "resource.h"
#include <math.h>
#define MAX_LOADSTRING 100
#define iSizeBitmapx 21 //ширина шаблона клетки
#define iSizeBitmapy 21 //высота шаблона клетки
#define CoeffCorr 5000 //
#define MaxRadofCell 8 //максимальный радиус круглого шаблона клетки (для овального - максимальный размер по вертикали)
#define MinRadofCell 6 //минимальный радиус -//-
#define MaxnCadres 2000 //максимальное количество кадров, которое будет обработано (если кадров меньше, обработаются все, начиная со стартового кадра)
#define DelColor 24 //минимальная разность в цвете между светлой и темной областью. Если разность меньше, то считается, что в данной точке нет клетки сходной с данным шаблоном
#define DColor 1.3 //минимальное отношение цветов -//-
#define StartCadr 1 //номер стартового кадра
#define NumberofCadres 50//число кадров, которое будет обработано
#define StartpixX1 100 //координаты прямоугольника, в котором ищутся клетки
#define StartpixX2 500 //
#define StartpixY1 50 //
#define StartpixY2 560 //
#define Okrest 4 //размер квадрата окрестности, в котором ищется данная клетка на следующем кадре
#define PI 3.14159265358979323846 //пи и в Африке пи
#define NumberOfShablone 2 //количество шаблонов (шаблоны отличаются разной степенью эллиптичности)
#define MinObjem 10 //минимальный объем клетки (в пикселах)
#define NumOfUgol 2 //количество поворотов шаблона на определенный угол
// открываемый файл
//char OPEN_FILE[]="59_07.avi";
//char OPEN_FILE[]="f:\\Data\\362\\362_500kHz_1.avi";
char OPEN_FILE[]="239_1000kHz_1.avi";
//Следующие две функции по созданию бмп-файла взяты из MSDN
//вроде работает, но почему-то не всегда.
PBITMAPINFO CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;
if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp))
MessageBox (hwnd,"error","GetObject",MB_OK);
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if (cClrBits == 1)
cClrBits = 1;
else if (cClrBits <= 4)
cClrBits = 4;
else if (cClrBits <= 8)
cClrBits = 8;
else if (cClrBits <= 16)
cClrBits = 16;
else if (cClrBits <= 24)
cClrBits = 24;
else cClrBits = 32;
if (cClrBits != 24)
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * (1<< cClrBits));
else
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if (cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits);
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
* pbmi->bmiHeader.biHeight;
pbmi->bmiHeader.biClrImportant = 0;
return pbmi;
}
void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi,
HBITMAP hBMP, HDC hDC)
{
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memory pointer
DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp;
pbih = (PBITMAPINFOHEADER) pbi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
if (!lpBits)
MessageBox (hwnd,"error","GlobalAlloc",MB_OK);
if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
DIB_RGB_COLORS))
MessageBox (hwnd,"error","GetDIBits",MB_OK);
hf = CreateFile(pszFile,
GENERIC_READ | GENERIC_WRITE,
(DWORD) 0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
if (hf == INVALID_HANDLE_VALUE)
MessageBox (hwnd,"error","CreateFile",MB_OK);
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof (RGBQUAD);
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL))
MessageBox (hwnd,"error","WriteFile",MB_OK);
if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, ( NULL) ) )
MessageBox (hwnd,"error","WriteFile",MB_OK);
dwTotal = cb = pbih->biSizeImage;
hp = lpBits;
if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
MessageBox (hwnd,"error","WriteFile",MB_OK);
if (!CloseHandle(hf))
MessageBox (hwnd,"error","CloseHandle",MB_OK);
GlobalFree((HGLOBAL)lpBits);
}
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text
// Foward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_CELLPAINT, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_CELLPAINT);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
// PURPOSE: Registers the window class.
// COMMENTS:
// This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_CELLPAINT);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_CELLPAINT;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
// FUNCTION: InitInstance(HANDLE, int)
// PURPOSE: Saves instance handle and creates main window
// COMMENTS:
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
// PURPOSE: Processes messages for the main window.
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBitMap; //хендлер для картинки
static HBITMAP bmp; //еще один
static HDC bmpDC; //hdc
int wmId, wmEvent;
PAINTSTRUCT ps;
static HDC hdc;
static PBITMAPINFO pbinfo;//инфо cтруктура bmp файла
int *Result;
char str[1024]; //строка с путем на открываемый файл
char buffer[80]="";
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
char NUMCELLS[128]; //массив, в котором будет находиться имя файла, содержащего число найденных клеток.
char NUMCELLS1[128]; //массив, в котором будет находиться имя файла, содержащего число найденных клеток.
static int iNumCorr[CoeffCorr]; //в ячейках этого массива лежит количество клеток с данным коэффициентом корреляции, являющихся кандидатами в истинные клетки
static int NumberCells=0; //общее количество кандидатов в клетки
static int iStartPos[CoeffCorr]; //массив, в котором находятся стартовые позиции для координат кандидатов в клетки с данным коэффициентом корреляции
int iRadius; //радиус (величина переменная, используется в разных местах, поэтому каждое использование отдельно по тексту)
static int DiamCell=0; //расстояние между двумя кандидатами в клетки (а вовсе не диаметр)
int p; //переменная величина
int xCell,yCell; //координаты кандидатов в клетки
float points[MaxRadofCell+3][NumberOfShablone][NumOfUgol];//количество точек в эллипсе (зависит от размеров, и угла, на который повернут эллипс)
int Position=0; //
int i,j,k,l,m;
int t;
int x,y;
int xCell1,yCell1; //координаты кандидатов в клетки (они используются при вычислении DiamCell)
static float color[MaxRadofCell+3][NumberOfShablone][NumOfUgol]; //средний цвет по данному эллипсу
int Objem[MaxRadofCell+3][NumberOfShablone][NumOfUgol]; //объем данного эллипса
static BITMAP bitmap;
int NumberofCellsend; //количество клеток на данном кадре (найденное)
int iCentrCellx=(iSizeBitmapx-1)/2; //координаты центра клетки на шаблоне
int iCentrCelly=(iSizeBitmapy-1)/2; //
int correl=10000; //коэффициент корреляции клетки с центром в данной точке (наилучший для разных шаблонов)
int correlprom[MaxRadofCell+3][NumberOfShablone][NumOfUgol]; //коэффициент корреляции для клетки с центром в данной точке (наилучший для данного шаблона)
int iCellRad; //переменная величина
int PromUgol; //переменная величина
FILE * stream;
static MCI_DGV_STEP_PARMS step;
static WORD nCadres=MaxnCadres;
static OPENFILENAME of;
DWORD * fastImage;
static WORD pos=0; //номер кадра (отсчет ведется от стартового кадра)
static MCI_DGV_OPEN_PARMS mciOpen;
int NumOfShablone;
struct tag_three_color
{
float blue;
float green;
float red;
} colormass [MaxRadofCell+3][NumberOfShablone][NumOfUgol]; //структура средних цветов данного эллипса (повернутого на данный угол)
static MCIERROR error;
static MCI_DGV_RECT_PARMS mciRect;
static MCI_DGV_WINDOW_PARMS mciWindow;
DWORD * iRadiusofCell; //указатель на массив, в котором хранятся радиусы кандидатов в клетки
DWORD * iEllofCell; //указатель на массив, в котором хранятся разности между шириной и высотой кандидатов в клетки
DWORD * UgolofCell; //указатель на массив, в котором хранятся углы поворота кандидатов в клетки
static MCI_STATUS_PARMS Status;
static RECT rc;
static MCI_DGV_PLAY_PARMS mciPlay;
switch (message)
{
case WM_CREATE:
{
mciOpen.lpstrElementName = OPEN_FILE;
stream=fopen (mciOpen.lpstrElementName,"r");
if (stream==NULL) DestroyWindow (hWnd);
fclose (stream);
mciOpen.dwStyle = WS_CHILD; // Set the style.
mciOpen.hWndParent = hWnd; // Give a window handle.
mciOpen.lpstrDeviceType = "avivideo";
error=mciSendCommand(0, MCI_OPEN,
(DWORD)(MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT),
(DWORD)(LPSTR)&mciOpen);
GetClientRect (hWnd,&rc);
error=mciSendCommand(mciOpen.wDeviceID, MCI_WHERE,
MCI_DGV_WHERE_SOURCE,
(DWORD)(LPSTR)&mciRect);
rc.right=mciRect.rc.right;
rc.bottom=mciRect.rc.bottom;
SetWindowPos (hWnd,HWND_TOP,rc.left,rc.top,
rc.right+2*GetSystemMetrics(SM_CXSIZEFRAME),
rc.bottom+2*GetSystemMetrics(SM_CYSIZEFRAME)+
2*GetSystemMetrics(SM_CYMENU),
SWP_DRAWFRAME);
mciWindow.hWnd = hWnd;
error=mciSendCommand(mciOpen.wDeviceID, MCI_WINDOW,
MCI_DGV_WINDOW_HWND,
(DWORD)(LPSTR)&mciWindow);
DWORD dwFlags = 0;
step.dwCallback=NULL;
} break;
case WM_LBUTTONDOWN:
{
int Shape [iSizeBitmapx][iSizeBitmapx][NumberOfShablone][NumOfUgol]; //массив, в котором нарисованы все шаблоны клеток
iCentrCellx=(iSizeBitmapx-1)/2;
iCentrCelly=(iSizeBitmapy-1)/2;
hdc = GetDC (hWnd);
bmpDC = CreateCompatibleDC (hdc);
bmp = CreateCompatibleBitmap (hdc,iSizeBitmapx,iSizeBitmapy);
SelectObject (bmpDC,bmp);
//создание шаблона
for (i=0;i<NumberOfShablone;i++)
{
SelectObject (bmpDC,CreateSolidBrush (RGB(0,0,0)));
PatBlt (bmpDC,0,0,iSizeBitmapx,iSizeBitmapx,PATCOPY);
SelectObject (bmpDC, CreateSolidBrush (RGB(4,0,0)));
SelectObject (bmpDC, CreatePen (PS_SOLID,0,RGB(4,0,0)));
Ellipse (bmpDC,iCentrCellx-i,iCentrCelly-1,iCentrCellx+i+1,iCentrCelly+2); // outer space
for (iRadius=2;iRadius<MaxRadofCell+3;iRadius++)
{
SelectObject (bmpDC, CreatePen (PS_SOLID,0,RGB(4*iRadius,0,0)));
SelectObject (bmpDC,(HBRUSH)GetStockObject(NULL_BRUSH));
Ellipse (bmpDC,iCentrCellx-iRadius-i,iCentrCelly-iRadius,iCentrCellx+iRadius+i+1,iCentrCelly+iRadius+1); // outer space
}
BitBlt (hdc,0,0,iSizeBitmapx,iSizeBitmapy, bmpDC,0,0,SRCCOPY);
// MessageBox (hWnd,"ok","ok",MB_OK);
pbinfo = CreateBitmapInfoStruct(hWnd,bmp);
sprintf (str,"sumcell%d.bmp",i);
CreateBMPFile(hWnd,str,pbinfo, bmp, bmpDC) ;
for (l=0;l<iSizeBitmapx;l++)
for (j=0;j<iSizeBitmapx;j++)
{
Shape[l][j][i][(NumOfUgol-1)/2]=GetPixel(bmpDC,l,j);
}
}
// поворот шаблона
double NewX,NewY;//координаты точки после поворота на определенный угол
double Ugol; //угол поворота
for (i=0;i<NumOfUgol;i++)
{
if (NumOfUgol==1)
{
Ugol =0;
}
else
{
Ugol=((double)i-(NumOfUgol-1)/2.)*PI/5./(NumOfUgol+1);
}
for (j=0;j<NumberOfShablone;j++)
{
for (k=0;k<iSizeBitmapx;k++)
for(l=0;l<iSizeBitmapy;l++)
{
NewX=((double)(k-iCentrCellx)*cos(Ugol)+(double)(l-iCentrCelly)*sin(Ugol))+iCentrCellx;
NewY=(-(double)(k-iCentrCellx)*sin(Ugol)+(double)(l-iCentrCelly)*cos(Ugol))+iCentrCelly;
if (NewX-(double)(int)NewX>=0.5)
NewX=(double)(int)NewX+1;
if (NewY-(double)(int)NewY>=0.5)
NewY=(double)(int)NewY+1;
if (NewX>=0 && NewX<iSizeBitmapx &&
NewY>=0 && NewY<iSizeBitmapy)
{
SetPixel(bmpDC,(int)NewX,(int)NewY,Shape[k][l][j][(NumOfUgol-1)/2]);
}
}
for (k=0;k<iSizeBitmapx;k++)
for(l=0;l<iSizeBitmapy;l++)
{
Shape[k][l][j][i]=GetPixel(bmpDC,k,l);
}
BitBlt (hdc,0,0,iSizeBitmapx,iSizeBitmapy, bmpDC,0,0,SRCCOPY);
// MessageBox (hWnd,"ok","ok",MB_OK);
pbinfo = CreateBitmapInfoStruct(hWnd,bmp);
sprintf (str,"sumcell%d%d.bmp",j,i);
CreateBMPFile(hWnd,str,pbinfo, bmp,bmpDC);
}
}
//окончание создания шаблонов
//first cadr
{
//переход на стартовый кадр
step.dwFrames=StartCadr;
error=mciSendCommand(
mciOpen.wDeviceID,
MCI_STEP,
MCI_DGV_STEP_FRAMES,
(DWORD) (LPMCI_DGV_STEP_PARMS) &step);
if (error!=0)//если это не удалось, убить программу
{
DestroyWindow (hWnd);
break;
}
fastImage = new DWORD [(rc.right-rc.left)*(rc.bottom-rc.top)];//тут хранится текущий кадр
BitBlt (bmpDC,0,0,800,600,hdc,0,0,SRCCOPY);
DWORD * corr;
if (StartpixX1!=NULL)
{
rc.left=StartpixX1;
rc.top=StartpixY1;
rc.right=StartpixX2;
rc.bottom=StartpixY2;
}
corr=new DWORD [(rc.right-rc.left-iSizeBitmapx)*
(rc.bottom-rc.top-iSizeBitmapy)];
iRadiusofCell=new DWORD [(rc.right-rc.left-iSizeBitmapx)*
(rc.bottom-rc.top-iSizeBitmapy)];
iEllofCell=new DWORD [(rc.right-rc.left-iSizeBitmapx)*
(rc.bottom-rc.top-iSizeBitmapy)];
UgolofCell=new DWORD [(rc.right-rc.left-iSizeBitmapx)*
(rc.bottom-rc.top-iSizeBitmapy)];
for (i=0;i<(rc.right-rc.left-iSizeBitmapx)*(rc.bottom-rc.top-iSizeBitmapy);i++)
{
corr[i]=0;
iRadiusofCell[i]=0;
}
Sleep(1000);
MessageBeep(-1);
for (i=rc.left;i<rc.right;i++)
for (j=rc.top;j<rc.bottom;j++)
{
fastImage [(i-rc.left)*(rc.bottom-rc.top)+j-rc.top]=GetPixel(hdc,i,j);
// SetPixel(hdc,i,j,fastImage [(i-rc.left)*(rc.bottom-rc.top)+j-rc.top]);
}
for (i=0;i<MaxRadofCell+3;i++)
for (j=0;j<NumberOfShablone;j++)
for (k=0;k<NumOfUgol;k++)
points[i][j][k]=0;
for (i=0;i<iSizeBitmapx;i++)
for (j=0;j<iSizeBitmapy;j++)
for (k=0;k<NumberOfShablone;k++)
for (l=0;l<NumOfUgol;l++)
points [ Shape [i][j][k][l]>>2 ][k][l] += 1;
for (i=0;i<MaxRadofCell+3;i++)
for(j=0;j<NumberOfShablone;j++)
for (k=0;k<NumOfUgol;k++)
Objem[i][j][k]=0;
for (i=1;i<MaxRadofCell+3;i++)
for(j=0;j<NumberOfShablone;j++)
for (k=0;k<NumOfUgol;k++)
Objem[i][j][k]=Objem[i-1][j][k]+(int)points[i][j][k];
for (i=0;i<rc.right-rc.left-iSizeBitmapx;i++)
for (j=0;j<rc.bottom-rc.top-iSizeBitmapy;j++)
{
for (k=0;k<MaxRadofCell+3;k++)
for (l=0;l<NumberOfShablone;l++)
for (m=0;m<NumOfUgol;m++)
{
colormass [k][l][m].red = 0;
colormass [k][l][m].green = 0;
colormass [k][l][m].blue = 0;
}
for (k=0;k<iSizeBitmapx;k++)
for (l=0;l<iSizeBitmapy;l++)
{
for (t=0;t<NumberOfShablone;t++)
for (m=0;m<NumOfUgol;m++)
{
x = k+i;
y = l+j;
colormass[ Shape [k][l][t][m] >>2][t][m].blue += (
(fastImage [x*(rc.bottom-rc.top)+y] & 0x00ff0000) >> 16);
colormass[ Shape [k][l][t][m] >>2][t][m].green +=
(fastImage [x*(rc.bottom-rc.top)+y] & 0x0000ff00) >> 8;
colormass[ Shape [k][l][t][m] >>2][t][m].red +=
(fastImage [x*(rc.bottom-rc.top)+y] & 0x000000ff);
}
}
for (p=0;p<MaxRadofCell+3;p++)
for(k=0;k<NumberOfShablone;k++)
for (m=0;m<NumOfUgol;m++)
{
colormass[p][k][m].blue = ((float) colormass[p][k][m].blue /
(float) points [p][k][m]);
colormass[p][k][m].green = ((float) colormass[p][k][m].green /
(float) points [p][k][m]);
colormass[p][k][m].red = ((float) colormass[p][k][m].red /
(float) points [p][k][m]);
}
for (p=0;p<MaxRadofCell+3;p++)
for (k=0;k<NumberOfShablone;k++)
for (m=0;m<NumOfUgol;m++)
color[p][k][m]=(float)(colormass[p][k][m].red+
colormass[p][k][m].blue+
colormass[p][k][m].green);
correl=5000;
iCellRad=0;
NumOfShablone=0;
for (m=0;m<NumOfUgol;m++)
for (k=0;k<NumberOfShablone;k++)
for(iRadius=MinRadofCell;iRadius<MaxRadofCell+1;iRadius++)
{
correlprom[iRadius][k][m]=(int)
(10000./
(
color[iRadius+2][k][m]/color[iRadius][k][m] +
color[1][k][m]/color[iRadius][k][m]
)
);
if (correl>correlprom[iRadius][k][m] && Objem[iRadius][k][m]>MinObjem)
{
correl=correlprom[iRadius][k][m];
iCellRad=iRadius;
NumOfShablone=k;
PromUgol=m;
}
}
if (iCellRad!=0 &&
(color[1][NumOfShablone][PromUgol] / color [iCellRad][NumOfShablone][PromUgol] > DColor) &&
(color[1][NumOfShablone][PromUgol] - color [iCellRad][NumOfShablone][PromUgol] > DelColor) &&
// (color[iCellRad-2][NumOfShablone] - color[iCellRad][NumOfShablone] > DelColor) &&
(color[iCellRad+2][NumOfShablone][PromUgol] - color[iCellRad][NumOfShablone][PromUgol] > DelColor ) &&
// (color[iCellRad-2][NumOfShablone] / color [iCellRad][NumOfShablone] > DColor) &&
(color[iCellRad+2][NumOfShablone][PromUgol] / color [iCellRad][NumOfShablone][PromUgol] > DColor))
{
corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j]=correl;
iNumCorr[corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j]]++;
iRadiusofCell[i*(rc.bottom-rc.top-iSizeBitmapy)+j]=iCellRad;
iEllofCell[i*(rc.bottom-rc.top-iSizeBitmapy)+j]=NumOfShablone;
UgolofCell[i*(rc.bottom-rc.top-iSizeBitmapy)+j]=PromUgol;
SetPixel(hdc,i+(iSizeBitmapx-1)/2+rc.left,rc.top+j+(iSizeBitmapy-1)/2,0xff0000);
}
}
for (i=1;i<CoeffCorr;i++)
{
NumberCells+=iNumCorr[i];
}
int (*pointer);
pointer = new int[2*NumberCells+CoeffCorr];
iStartPos[0]=0;
for (i=1;i<CoeffCorr;i++)
{
iStartPos[i]=iStartPos[i-1]+iNumCorr[i-1]*2+1;
}
for (i=0;i<2*NumberCells+CoeffCorr;i++)
{
*(pointer+i)=0;
}
for (i=0;i<rc.right-rc.left-iSizeBitmapx;i++)
for(j=0;j<rc.bottom-rc.top-iSizeBitmapy;j++)
{
if (corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j]<CoeffCorr
&& corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j]!=0)
{
l=corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j];
k=*(pointer+iStartPos[l]);
*(pointer+iStartPos[l]+2*k+1)=i+rc.left;
*(pointer+iStartPos[l]+2*k+2)=j+rc.top;
*(pointer+iStartPos[l])+=1;
}
}
int *Cells;
Position=0;
Cells = new int[2*NumberCells];
for (i=0;i<CoeffCorr;i++)
for(j=0;j<*(pointer+iStartPos[i]);j++)
{
*(Cells+Position)=*(pointer+iStartPos[i]+2*j+1);
*(Cells+Position+1)=*(pointer+iStartPos[i]+2*j+2);
Position+=2;
}
for (i=0;i<NumberCells;i++)
{
xCell=*(Cells+2*i);
yCell=*(Cells+2*i+1);
if(xCell!=0 && yCell!=0)
{
for (j=i+1;j<NumberCells;j++)
{
xCell1=*(Cells+2*j);
yCell1=*(Cells+2*j+1);
if (xCell1!=0 && yCell1!=0)
{
DiamCell=iRadiusofCell[(xCell-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+(yCell-rc.top)]+
iRadiusofCell[(xCell1-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+(yCell1-rc.top)];
if ( (xCell-xCell1)*(xCell-xCell1)+(yCell-yCell1)*(yCell-yCell1)<DiamCell*DiamCell)
{
*(Cells+2*j)=0;
*(Cells+2*j+1)=0;
}
}
}
}
}
NumberofCellsend=0;
for (i=0;i<NumberCells;i++)
{
if(*(Cells+2*i)!=0 && *(Cells+2*i+1)!=0)
{
NumberofCellsend++;
SelectObject (hdc, CreatePen (PS_SOLID,0,RGB(0xff,0,0)));
SelectObject (hdc,(HBRUSH)GetStockObject(NULL_BRUSH));
Ellipse (hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2-iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]-iEllofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top],
*(Cells+2*i+1)+(iSizeBitmapx-1)/2-iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]
,*(Cells+2*i)+(iSizeBitmapx-1)/2+1+iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]+iEllofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]
,*(Cells+2*i+1)+(iSizeBitmapx-1)/2+1+iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]); // outer space
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2,*(Cells+2*i+1)+(iSizeBitmapx-1)/2,0xff0000);
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2-1,*(Cells+2*i+1)+(iSizeBitmapx-1)/2-1,0xff0000);
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2+1,*(Cells+2*i+1)+(iSizeBitmapx-1)/2+1,0xff0000);
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2+1,*(Cells+2*i+1)+(iSizeBitmapx-1)/2-1,0xff0000);
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2-1,*(Cells+2*i+1)+(iSizeBitmapx-1)/2+1,0xff0000);
}
}
Result=new int[NumberofCadres*NumberofCellsend*5];
j=0;
Sleep(2500);
FILE* Fpout;
Fpout=fopen("ell.txt","wb");
for (i=0;i<NumberCells;i++)
{
if(*(Cells+2*i)!=0 && *(Cells+2*i+1)!=0)
{
fprintf(Fpout,"%d %d %d %d\n",*(Cells+2*i)+(iSizeBitmapx-1)/2,*(Cells+2*i+1)+(iSizeBitmapx-1)/2,iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top],iEllofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]);
Result[j]=*(Cells+2*i);
Result[j+1]=*(Cells+2*i+1);
Result[j+2]=iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top];
Result[j+3]=iEllofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top];
Result[j+4]=UgolofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top];
j+=5;
}
}
fclose(Fpout);
delete Cells;
delete corr;
delete pointer;
}
int q,w;
int *Flag;
Flag=new int[NumberofCellsend];
for (i=0;i<NumberofCellsend;i++)
{
Flag[i]=0;
}
pos=1;
//laster cadres.
while (pos<NumberofCadres-1)
{
step.dwFrames=1;
error=mciSendCommand(
mciOpen.wDeviceID,
MCI_STEP,
MCI_NOTIFY,
(DWORD) (LPMCI_DGV_STEP_PARMS) &step);
Sleep(50);
BitBlt (bmpDC,0,0,800,600,hdc,0,0,SRCCOPY);
if (error!=0)
{
DestroyWindow (hWnd);
break;
}
for (i=rc.left;i<rc.right;i++)
for (j=rc.top;j<rc.bottom;j++)
fastImage [(i-rc.left)*(rc.bottom-rc.top)+j-rc.top]=GetPixel(hdc,i,j);
int XofCell,YofCell,RadiofCell;
int corr1=5000;
for (i=0;i<NumberofCellsend;i++)
{
XofCell=Result[NumberofCellsend*5*(pos-1)+5*i]-rc.left;
Result[NumberofCellsend*5*(pos)+5*i]=Result[NumberofCellsend*5*(pos-1)+5*i];
YofCell=Result[NumberofCellsend*5*(pos-1)+5*i+1]-rc.top;
RadiofCell=Result[NumberofCellsend*5*(pos-1)+5*i+2];
corr1=5000;
Result[NumberofCellsend*5*(pos)+5*i+1]=Result[NumberofCellsend*5*(pos-1)+5*i+1];
Result[NumberofCellsend*5*(pos)+5*i+2]=Result[NumberofCellsend*5*(pos-1)+5*i+2];
Result[NumberofCellsend*5*(pos)+5*i+3]=Result[NumberofCellsend*5*(pos-1)+5*i+3];
if (Flag[i]>4)
{
Result[NumberofCellsend*5*(pos)+5*i]=NULL;
Result[NumberofCellsend*5*(pos)+5*i+1]=NULL;
Result[NumberofCellsend*5*(pos)+5*i+2]=NULL;
Result[NumberofCellsend*5*(pos)+5*i+3]=NULL;
Result[NumberofCellsend*5*(pos)+5*i+4]=NULL;
}
Flag[i]++;
if (XofCell!=NULL && YofCell!=NULL)
{
for(q=XofCell-Okrest;q<XofCell+Okrest;q++)
for (w=YofCell-Okrest;w<YofCell+Okrest;w++)
{
if(q>=0 && q<rc.right-rc.left-iSizeBitmapx
&& w>=0 && w<rc.bottom-rc.top-iSizeBitmapy)
{
for (k=0;k<iSizeBitmapx;k++)
for (l=0;l<iSizeBitmapy;l++)
for (t=0;t<NumberOfShablone;t++)
for (m=0;m<NumOfUgol;m++)
{
x = k+q;
y = l+w;
colormass[ Shape [k][l][t][m] >>2][t][m].blue += (
(fastImage [x*(rc.bottom-rc.top)+y] & 0x00ff0000) >> 16);
colormass[ Shape [k][l][t][m] >>2][t][m].green +=
(fastImage [x*(rc.bottom-rc.top)+y] & 0x0000ff00) >> 8;
colormass[ Shape [k][l][t][m] >>2][t][m].red +=
(fastImage [x*(rc.bottom-rc.top)+y] & 0x000000ff);
}
correl=5000;
for (p=0;p<MaxRadofCell+3;p++)
for (t=0;t<NumberOfShablone;t++)
for (m=0;m<NumOfUgol;m++)
{
colormass[p][t][m].blue = ((float) colormass[p][t][m].blue /
(float) points [p][t][m]);
colormass[p][t][m].green = ((float) colormass[p][t][m].green /
(float) points [p][t][m]);
colormass[p][t][m].red = ((float) colormass[p][t][m].red /
(float) points [p][t][m]);
}
for (p=0;p<MaxRadofCell+3;p++)
for (t=0;t<NumberOfShablone;t++)
for (m=0;m<NumOfUgol;m++)
color[p][t][m]=(float)(colormass[p][t][m].red+
colormass[p][t][m].blue +
colormass[p][t][m].green);
NumOfShablone=0;
for(iRadius=MinRadofCell;iRadius<MaxRadofCell+1;iRadius++)
for (m=0;m<NumOfUgol;m++)
for (t=0;t<NumberOfShablone;t++)
{
correlprom[iRadius][t][m]=(int)
(10000./
(
color[iRadius+2][t][m]/color[iRadius][t][m] +
color[1][t][m]/color[iRadius][t][m]
)
);
if (correl>correlprom[iRadius][t][m] && Objem[iRadius][t][m]>MinObjem)
{
correl=correlprom[iRadius][t][m];
iCellRad=iRadius;
NumOfShablone=t;
PromUgol=m;
}
}
if (iCellRad!=0 &&
(color[1][NumOfShablone][PromUgol] - color[iCellRad][NumOfShablone][PromUgol] > DelColor) &&
(color[iCellRad+2][NumOfShablone][PromUgol] - color[iCellRad][NumOfShablone][PromUgol] > DelColor ) &&
(color[1][NumOfShablone][PromUgol] / color [iCellRad][NumOfShablone][PromUgol] > DColor) &&
(color[iCellRad+2][NumOfShablone][PromUgol] / color [iCellRad][NumOfShablone][PromUgol] > DColor) )
{
if(correl<corr1)
{
corr1=correl;
Result[NumberofCellsend*5*(pos)+5*i]=q+rc.left;
Result[NumberofCellsend*5*(pos)+5*i+1]=w+rc.top;
Result[NumberofCellsend*5*(pos)+5*i+2]=iCellRad;
Result[NumberofCellsend*5*(pos)+5*i+3]=NumOfShablone;
Result[NumberofCellsend*5*(pos)+5*i+4]=PromUgol;
Flag[i]=0;
}
}
}
}
}
}
for (j=0;j<NumberofCellsend;j++)
{
if(Result[NumberofCellsend*5*(pos)+5*j]!=NULL && Result[NumberofCellsend*5*(pos)+5*j+1]!=0)
{
SetPixel(hdc,Result[NumberofCellsend*5*(pos)+5*j]+(iSizeBitmapx-1)/2,Result[NumberofCellsend*5*(pos)+5*j+1]+(iSizeBitmapx-1)/2,0xff0000);
SetPixel(hdc,Result[NumberofCellsend*5*(pos)+5*j]+(iSizeBitmapx-1)/2-1,Result[NumberofCellsend*5*(pos)+5*j+1]+(iSizeBitmapx-1)/2-1,0xff0000);
SetPixel(hdc,Result[NumberofCellsend*5*(pos)+5*j]+(iSizeBitmapx-1)/2+1,Result[NumberofCellsend*5*(pos)+5*j+1]+(iSizeBitmapx-1)/2+1,0xff0000);
SetPixel(hdc,Result[NumberofCellsend*5*(pos)+5*j]+(iSizeBitmapx-1)/2+1,Result[NumberofCellsend*5*(pos)+5*j+1]+(iSizeBitmapx-1)/2-1,0xff0000);
SetPixel(hdc,Result[NumberofCellsend*5*(pos)+5*j]+(iSizeBitmapx-1)/2-1,Result[NumberofCellsend*5*(pos)+5*j+1]+(iSizeBitmapx-1)/2+1,0xff0000);
SelectObject (hdc, CreatePen (PS_SOLID,0,RGB(0xff,0,0)));
SelectObject (hdc,(HBRUSH)GetStockObject(NULL_BRUSH));
Ellipse (hdc,Result[NumberofCellsend*5*(pos)+5*j]+(iSizeBitmapx-1)/2-Result[NumberofCellsend*5*(pos)+5*j+2]-Result[NumberofCellsend*5*(pos)+5*j+3],
Result[NumberofCellsend*5*(pos)+5*j+1]+(iSizeBitmapx-1)/2-Result[NumberofCellsend*5*(pos)+5*j+2]
,Result[NumberofCellsend*5*(pos)+5*j]+(iSizeBitmapx-1)/2+1+Result[NumberofCellsend*5*(pos)+5*j+2]+Result[NumberofCellsend*5*(pos)+5*j+3]
,Result[NumberofCellsend*5*(pos)+5*j+1]+(iSizeBitmapx-1)/2+1+Result[NumberofCellsend*5*(pos)+5*j+2]); // outer space
}
}
pos++;
Sleep(200);
// MessageBeep(-1);
// MessageBox (hWnd,"ok","ok",MB_OK);
}
int NumCellsEND=0;
FILE* cells;
FILE* cells1;
sprintf (NUMCELLS,"wg_5_%d_%d.txt",StartCadr,NumberofCadres);
sprintf (NUMCELLS1,"wg%d_%d.txt",StartCadr,NumberofCadres);
cells=fopen(NUMCELLS,"wb");
cells1=fopen(NUMCELLS1,"wb");
for (i=0;i<NumberofCellsend;i++)
{
if (Result[5*NumberofCellsend*(NumberofCadres-1)+5*i]!=0 && Result[5*NumberofCellsend*(NumberofCadres-1)+5*i+1]!=0)
{
for (j=0;j<NumberofCadres;j++)
{
fprintf(cells,"%d %d %d %d %d ",
Result[5*j*NumberofCellsend+5*i]
+(iSizeBitmapx-1)/2,
Result[5*j*NumberofCellsend+5*i+1]
+(iSizeBitmapx-1)/2,
Result[5*j*NumberofCellsend+5*i+2],
Result[5*j*NumberofCellsend+5*i+3],
Result[5*j*NumberofCellsend+5*i+4]);
fprintf(cells1,"%d %d %d ",
Result[5*j*NumberofCellsend+5*i]
+(iSizeBitmapx-1)/2,
Result[5*j*NumberofCellsend+5*i+1]
+(iSizeBitmapx-1)/2,
Result[5*j*NumberofCellsend+5*i+2]);
}
NumCellsEND++;
fprintf(cells,"\n");
fprintf(cells1,"\n");
}
}
NumCellsEND=0;
FILE* cellsnew;
sprintf (NUMCELLS,"wgnew%d_%d.txt",StartCadr,NumberofCadres);
cellsnew=fopen(NUMCELLS,"wb");
for (i=0;i<NumberofCellsend;i++)
{
if (Result[5*NumberofCellsend*(NumberofCadres-1)+5*i]!=0 && Result[5*NumberofCellsend*(NumberofCadres-1)+5*i+1]!=0)
{
for (j=0;j<NumberofCadres;j++)
{
fprintf(cellsnew,"%d ",
Result[5*j*NumberofCellsend+5*i]
+(iSizeBitmapx-1)/2);
}fprintf(cellsnew,"\n");
for (j=0;j<NumberofCadres;j++)
{
fprintf(cellsnew,"%d ",
Result[5*j*NumberofCellsend+5*i+1]
+(iSizeBitmapx-1)/2);
}fprintf(cellsnew,"\n");
for (j=0;j<NumberofCadres;j++)
{
fprintf(cellsnew,"%d ",
Result[5*j*NumberofCellsend+5*i+2]);
}fprintf(cellsnew,"\n");
for (j=0;j<NumberofCadres;j++)
{
fprintf(cellsnew,"%d ",
Result[5*j*NumberofCellsend+5*i+3]);
}fprintf(cellsnew,"\n");
for (j=0;j<NumberofCadres;j++)
{
fprintf(cellsnew,"%d ",
Result[5*j*NumberofCellsend+5*i+4]);
}
NumCellsEND++;
fprintf(cellsnew,"\n");
}
}
fclose(cellsnew);
fclose(cells);
sprintf (NUMCELLS,"numcells%d_%d.txt",StartCadr,NumberofCadres);
cells=fopen(NUMCELLS,"wb");
fprintf(cells,"%d",NumCellsEND);
fclose(cells);
// последний кадр
{
//переход на последний кадр
step.dwFrames=pos;
error=mciSendCommand(
mciOpen.wDeviceID,
MCI_STEP,
MCI_DGV_STEP_FRAMES,
(DWORD) (LPMCI_DGV_STEP_PARMS) &step);
if (error!=0)//если это не удалось, убить программу
{
DestroyWindow (hWnd);
break;
}
fastImage = new DWORD [(rc.right-rc.left)*(rc.bottom-rc.top)];//тут хранится текущий кадр
BitBlt (bmpDC,0,0,800,600,hdc,0,0,SRCCOPY);
DWORD * corr;
if (StartpixX1!=NULL)
{
rc.left=StartpixX1;
rc.top=StartpixY1;
rc.right=StartpixX2;
rc.bottom=StartpixY2;
}
corr=new DWORD [(rc.right-rc.left-iSizeBitmapx)*
(rc.bottom-rc.top-iSizeBitmapy)];
iRadiusofCell=new DWORD [(rc.right-rc.left-iSizeBitmapx)*
(rc.bottom-rc.top-iSizeBitmapy)];
iEllofCell=new DWORD [(rc.right-rc.left-iSizeBitmapx)*
(rc.bottom-rc.top-iSizeBitmapy)];
UgolofCell=new DWORD [(rc.right-rc.left-iSizeBitmapx)*
(rc.bottom-rc.top-iSizeBitmapy)];
for (i=0;i<(rc.right-rc.left-iSizeBitmapx)*(rc.bottom-rc.top-iSizeBitmapy);i++)
{
corr[i]=0;
iRadiusofCell[i]=0;
}
Sleep(1000);
MessageBeep(-1);
for (i=rc.left;i<rc.right;i++)
for (j=rc.top;j<rc.bottom;j++)
{
fastImage [(i-rc.left)*(rc.bottom-rc.top)+j-rc.top]=GetPixel(hdc,i,j);
// SetPixel(hdc,i,j,fastImage [(i-rc.left)*(rc.bottom-rc.top)+j-rc.top]);
}
for (i=0;i<MaxRadofCell+3;i++)
for (j=0;j<NumberOfShablone;j++)
for (k=0;k<NumOfUgol;k++)
points[i][j][k]=0;
for (i=0;i<iSizeBitmapx;i++)
for (j=0;j<iSizeBitmapy;j++)
for (k=0;k<NumberOfShablone;k++)
for (l=0;l<NumOfUgol;l++)
points [ Shape [i][j][k][l]>>2 ][k][l] += 1;
for (i=0;i<MaxRadofCell+3;i++)
for(j=0;j<NumberOfShablone;j++)
for (k=0;k<NumOfUgol;k++)
Objem[i][j][k]=0;
for (i=1;i<MaxRadofCell+3;i++)
for(j=0;j<NumberOfShablone;j++)
for (k=0;k<NumOfUgol;k++)
Objem[i][j][k]=Objem[i-1][j][k]+(int)points[i][j][k];
for (i=0;i<rc.right-rc.left-iSizeBitmapx;i++)
for (j=0;j<rc.bottom-rc.top-iSizeBitmapy;j++)
{
for (k=0;k<MaxRadofCell+3;k++)
for (l=0;l<NumberOfShablone;l++)
for (m=0;m<NumOfUgol;m++)
{
colormass [k][l][m].red = 0;
colormass [k][l][m].green = 0;
colormass [k][l][m].blue = 0;
}
for (k=0;k<iSizeBitmapx;k++)
for (l=0;l<iSizeBitmapy;l++)
{
for (t=0;t<NumberOfShablone;t++)
for (m=0;m<NumOfUgol;m++)
{
x = k+i;
y = l+j;
colormass[ Shape [k][l][t][m] >>2][t][m].blue += (
(fastImage [x*(rc.bottom-rc.top)+y] & 0x00ff0000) >> 16);
colormass[ Shape [k][l][t][m] >>2][t][m].green +=
(fastImage [x*(rc.bottom-rc.top)+y] & 0x0000ff00) >> 8;
colormass[ Shape [k][l][t][m] >>2][t][m].red +=
(fastImage [x*(rc.bottom-rc.top)+y] & 0x000000ff);
}
}
for (p=0;p<MaxRadofCell+3;p++)
for(k=0;k<NumberOfShablone;k++)
for (m=0;m<NumOfUgol;m++)
{
colormass[p][k][m].blue = ((float) colormass[p][k][m].blue /
(float) points [p][k][m]);
colormass[p][k][m].green = ((float) colormass[p][k][m].green /
(float) points [p][k][m]);
colormass[p][k][m].red = ((float) colormass[p][k][m].red /
(float) points [p][k][m]);
}
for (p=0;p<MaxRadofCell+3;p++)
for (k=0;k<NumberOfShablone;k++)
for (m=0;m<NumOfUgol;m++)
color[p][k][m]=(float)(colormass[p][k][m].red+
colormass[p][k][m].blue+
colormass[p][k][m].green);
correl=5000;
iCellRad=0;
NumOfShablone=0;
for (m=0;m<NumOfUgol;m++)
for (k=0;k<NumberOfShablone;k++)
for(iRadius=MinRadofCell;iRadius<MaxRadofCell+1;iRadius++)
{
correlprom[iRadius][k][m]=(int)
(10000./
(
color[iRadius+2][k][m]/color[iRadius][k][m] +
color[1][k][m]/color[iRadius][k][m]
)
);
if (correl>correlprom[iRadius][k][m] && Objem[iRadius][k][m]>MinObjem)
{
correl=correlprom[iRadius][k][m];
iCellRad=iRadius;
NumOfShablone=k;
PromUgol=m;
}
}
if (iCellRad!=0 &&
(color[1][NumOfShablone][PromUgol] / color [iCellRad][NumOfShablone][PromUgol] > DColor) &&
(color[1][NumOfShablone][PromUgol] - color [iCellRad][NumOfShablone][PromUgol] > DelColor) &&
// (color[iCellRad-2][NumOfShablone] - color[iCellRad][NumOfShablone] > DelColor) &&
(color[iCellRad+2][NumOfShablone][PromUgol] - color[iCellRad][NumOfShablone][PromUgol] > DelColor ) &&
// (color[iCellRad-2][NumOfShablone] / color [iCellRad][NumOfShablone] > DColor) &&
(color[iCellRad+2][NumOfShablone][PromUgol] / color [iCellRad][NumOfShablone][PromUgol] > DColor))
{
corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j]=correl;
iNumCorr[corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j]]++;
iRadiusofCell[i*(rc.bottom-rc.top-iSizeBitmapy)+j]=iCellRad;
iEllofCell[i*(rc.bottom-rc.top-iSizeBitmapy)+j]=NumOfShablone;
UgolofCell[i*(rc.bottom-rc.top-iSizeBitmapy)+j]=PromUgol;
SetPixel(hdc,i+(iSizeBitmapx-1)/2+rc.left,rc.top+j+(iSizeBitmapy-1)/2,0xff0000);
}
}
for (i=1;i<CoeffCorr;i++)
{
NumberCells+=iNumCorr[i];
}
int (*pointer);
pointer = new int[2*NumberCells+CoeffCorr];
iStartPos[0]=0;
for (i=1;i<CoeffCorr;i++)
{
iStartPos[i]=iStartPos[i-1]+iNumCorr[i-1]*2+1;
}
for (i=0;i<2*NumberCells+CoeffCorr;i++)
{
*(pointer+i)=0;
}
for (i=0;i<rc.right-rc.left-iSizeBitmapx;i++)
for(j=0;j<rc.bottom-rc.top-iSizeBitmapy;j++)
{
if (corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j]<CoeffCorr
&& corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j]!=0)
{
l=corr[i*(rc.bottom-rc.top-iSizeBitmapy)+j];
k=*(pointer+iStartPos[l]);
*(pointer+iStartPos[l]+2*k+1)=i+rc.left;
*(pointer+iStartPos[l]+2*k+2)=j+rc.top;
*(pointer+iStartPos[l])+=1;
}
}
//тvёЄЁрштрэшх ъыхЄюъ т ьрёёшт яю ъю¤ЇЇшЎшхэЄє ъюЁЁхы Ўшш
int *Cells;
Position=0;
Cells = new int[2*NumberCells];
for (i=0;i<CoeffCorr;i++)
for(j=0;j<*(pointer+iStartPos[i]);j++)
{
*(Cells+Position)=*(pointer+iStartPos[i]+2*j+1);
*(Cells+Position+1)=*(pointer+iStartPos[i]+2*j+2);
Position+=2;
}
//єфрыхэшх ыш°эшї ъыхЄюъ
for (i=0;i<NumberCells;i++)
{
xCell=*(Cells+2*i);
yCell=*(Cells+2*i+1);
if(xCell!=0 && yCell!=0)
{
for (j=i+1;j<NumberCells;j++)
{
xCell1=*(Cells+2*j);
yCell1=*(Cells+2*j+1);
if (xCell1!=0 && yCell1!=0)
{
DiamCell=iRadiusofCell[(xCell-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+(yCell-rc.top)]+
iRadiusofCell[(xCell1-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+(yCell1-rc.top)];
if ( (xCell-xCell1)*(xCell-xCell1)+(yCell-yCell1)*(yCell-yCell1)<DiamCell*DiamCell)
{
*(Cells+2*j)=0;
*(Cells+2*j+1)=0;
}
}
}
}
}
NumberofCellsend=0;
for (i=0;i<NumberCells;i++)
{
if(*(Cells+2*i)!=0 && *(Cells+2*i+1)!=0)
{
NumberofCellsend++;
SelectObject (hdc, CreatePen (PS_SOLID,0,RGB(0xff,0,0)));
SelectObject (hdc,(HBRUSH)GetStockObject(NULL_BRUSH));
Ellipse (hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2-iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]-iEllofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top],
*(Cells+2*i+1)+(iSizeBitmapx-1)/2-iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]
,*(Cells+2*i)+(iSizeBitmapx-1)/2+1+iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]+iEllofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]
,*(Cells+2*i+1)+(iSizeBitmapx-1)/2+1+iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]); // outer space
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2,*(Cells+2*i+1)+(iSizeBitmapx-1)/2,0xff0000);
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2-1,*(Cells+2*i+1)+(iSizeBitmapx-1)/2-1,0xff0000);
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2+1,*(Cells+2*i+1)+(iSizeBitmapx-1)/2+1,0xff0000);
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2+1,*(Cells+2*i+1)+(iSizeBitmapx-1)/2-1,0xff0000);
SetPixel(hdc,*(Cells+2*i)+(iSizeBitmapx-1)/2-1,*(Cells+2*i+1)+(iSizeBitmapx-1)/2+1,0xff0000);
}
}
Result=new int[NumberofCadres*NumberofCellsend*5];
j=0;
Sleep(2500);
FILE* Fpout;
Fpout=fopen("ell1.txt","wb");
for (i=0;i<NumberCells;i++)
{
if(*(Cells+2*i)!=0 && *(Cells+2*i+1)!=0)
{
fprintf(Fpout,"%d %d %d %d\n",*(Cells+2*i)+(iSizeBitmapx-1)/2,*(Cells+2*i+1)+(iSizeBitmapx-1)/2,iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top],iEllofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top]);
Result[j]=*(Cells+2*i);
Result[j+1]=*(Cells+2*i+1);
Result[j+2]=iRadiusofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top];
Result[j+3]=iEllofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top];
Result[j+4]=UgolofCell[(*(Cells+2*i)-rc.left)*(rc.bottom-rc.top-iSizeBitmapy)+*(Cells+2*i+1)-rc.top];
j+=5;
}
}
fclose(Fpout);
delete Cells;
delete corr;
delete pointer;
}
//int q,w;
// int *Flag;
Flag=new int[NumberofCellsend];
for (i=0;i<NumberofCellsend;i++)
{
Flag[i]=0;
}
pos=1;
// MessageBox (hWnd,"ok","ok",MB_OK);
DestroyWindow (hWnd);
}
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
BitBlt (hdc,0,0,800,600,bmpDC,0,0,SRCCOPY);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
error=mciSendCommand( mciOpen.wDeviceID, MCI_CLOSE, NULL ,NULL);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}