Рефераты. Система идентификации личности по отпечаткам пальцев. Подсистема анализа изображения

  }

  //------расчет угла-------//

  double alpha2 = GetAlpha(A, B);

//-----alpha1, alpha2------//

  alpha1 = abs(alpha2 - alpha1);

  if (alpha1 > M_PI) alpha1 = 2.0*M_PI - alpha1;

  return alpha1 < (110.0/180.0 * M_PI);

}

CPoint TAnalysePicture::FindAcceptDot(CPoint dot, double alpha, bool type)

//Поиск продолжения из окончания/раздвоения

{

  const int maxL = 11;

  const int minL = 3;

  COLORREF color;

  color = (type)?0x000000:0xffffff;

      //окончание - ищем черную точку

      //раздвоение - ищем белую точку

  int i = 0;

  while (i<=6) //разброс поиска в указанном направлении alpha

  {

      int l = minL;

      int k = (i+1) / 2;

      if (i % 2 == 1) k = -k;

      while (l<=maxL)

      {

          double arg = alpha + k * M_PI * 5.0/180.0;

          int x = dot.x + (int)(l*cos(arg)+0.5);

          int y = dot.y - (int)(l*sin(arg)+0.5);

          if (tmpPic->GetPixel(x, y) == color)   //важное условие цвета точки!!!

          {

             if(TestFindDot(x,y))               //проверка найденной точки (на "вшивость" :) )

                 return CPoint(x, y);     //найденная точка

             else

                 break;

          }

          l++; //увеличение дальности поиска

      }

      i++;

  }

  return CPoint(-1, -1);   //точка не найдена

}


bool TAnalysePicture::Show(int x, int y, int xt, int yt)

{

  if(xt!=-1) pic2->Show(xt, yt);

  return pic->Show(x, y);

}

TFingPicture *TAnalysePicture::GetPic1()

{

  return pic;

}

TFingPicture *TAnalysePicture::GetPic2()

{

  return pic2;

}

double TAnalysePicture::ChangeAlphaInterval(double _alpha)

//Приведение итрервала к [-pi,pi)

{

  double ret = abs(_alpha);

  while(ret >= 2.0*M_PI) ret -= 2.0*M_PI;

  if(ret > M_PI) ret = 2.0*M_PI - ret;

  else ret = -ret;

  if(_alpha > 0) ret = -ret;

  return ret;

}

/*Фильтрование полученных точек

отсеиваются близкостоящие направленные в противоположные строки

а так же точки слева и справа от которых нет линий*/

int TAnalysePicture::DotsFilter(TAbsFing &_dots)

{

  int leftDots = 0;

  TAbsFing::iterator iter1;

  TAbsFing::iterator iter2;

  for(iter1 = _dots.begin(); iter1 != _dots.end(); iter1++)

  {

      if(!iter1->show) continue;

      //отсев точек сложным условием (условие окружения)

      iter1->show = LeftDot(iter1);

  }

  for(iter1 = _dots.begin(); iter1 != _dots.end(); iter1++)

  {

      if(!iter1->show) continue;


      //отсев близкостоящих точек

      for(iter2 = iter1, ++iter2; iter2 != _dots.end(); iter2++)

      {

          if(!iter2->show) continue;

          double difL = GetS(iter1->coord,iter2->coord);

          if( //условия отсева

             (

             //на близком растоянии (15) находятся два окончания/раздвоения направленных друг на друга

                 (difL < 15)&&

                 ((abs(iter2->alpha - iter1->alpha) > (165.0/180.0*M_PI))&&(abs(iter2->alpha - iter1->alpha)<(195.0/180.0*M_PI)))

             )

             ||

             (  

             //или просто очень близкие точки (<5..10)

                 (difL < 10)&&(iter1->type == iter2->type)

             )

          )

          {

             iter1->show = false;

             iter2->show = false;

          }

      }

  }

  return leftDots;

}

inline double TAnalysePicture::GetS(CPoint A, CPoint B)

//растояние между точками

{

  return sqrt( (double)((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)) );

}

/*Если точка является окончанием, то слева и справа от нее должны быть линии

если это не так, то точку нужно исключить из дальнейшего анализа*/

bool TAnalysePicture::LeftDot(TAbsFing::iterator &iter)

{

  COLORREF color = 0x000000;            //ищем черную точку для окончаний

  if(!iter->type) color = 0xffffff;;       //ищем белую точку для раздвоений

 

  int l, k = 35;

  const int minL = 4, maxL = 12;

  bool find = false;

  while(k <= 55)

  {

      l = minL;

      while(l <= maxL)

      {

          int x = iter->coord.x + (int)(l*cos(iter->alpha + k/180.0*M_PI)+0.5);

          int y = iter->coord.y - (int)(l*sin(iter->alpha + k/180.0*M_PI)+0.5);

          if(pic->GetPixel(x,y) == color)   // важное условие!!!

          {  find = true; break;}      //нашли точку слева

          l++;

      }

      if(find) break;

      k += 10;  //Поиск с шагом 10гр

  }

  if(!find) return false;

  k = 35;

  while(k <= 55)

  {

      l= minL;

      while(l <= maxL)

      {

          int x = iter->coord.x + (int)(l*cos(iter->alpha - k/180.0*M_PI)+0.5);

          int y = iter->coord.y - (int)(l*sin(iter->alpha - k/180.0*M_PI)+0.5);

          if(pic->GetPixel(x,y) == color) // важное условие!!!

             return true;              //нашли точку справа

          l++;

      }

      k += 10;

  }

  return false;

}

П.1.10. ТЕКСТ МОДУЛЯ TFingPicture.h

#pragma once

#include "Fing.h"


///////////////////////////////////////////////////////////////////////////////

//Класс изображения.

//Хранение изображения, выполнение простейших операции над ним

///////////////////////////////////////////////////////////////////////////////

class TFingPicture

{

private:

  CDC pic;        //указатель на изображение

  BITMAP bmp;           //изображение

  bool IsLoad;       //изображение загружено

  CDC *Screen;     //указатель на окно программы

public:

  TFingPicture(CDC *_Screen);        //_Screen - указатель на окно

  ~TFingPicture(void);

  bool Load(const CString src);    //загрузить изображение из файла src

  bool Show(int X, int Y);         //отобразить изображение на окне в координатах (X,Y)

  bool SetPixel(CPoint dot, COLORREF color);      //установка цвета пикселя dot

  bool SetPixel(int x, int y, COLORREF color);   //установка цвета пикселя (x,y)

  COLORREF GetPixel(CPoint dot);                   //взятие цвета пикселя dot

  COLORREF GetPixel(int x, int y);             //взятие цвета пикселя (x,y)

  bool FloodFill(CPoint dot, COLORREF color=0xffffff);  //заливка области (по умолчанию черным цветом)

  bool FloodFill(int x, int y, COLORREF color=0xffffff);    //заливка области (по умолчанию черным цветом)

  bool Line(CPoint from, CPoint to, int width, COLORREF color); //рисование линии

  bool Rectangle(CPoint from, CPoint to, int width=2, COLORREF color=0xffffff);    //рисование прямоугольника

  bool Copy(TFingPicture &from);           //копирование изображения

  CPoint NextDotCW(const CPoint dot, int &vec);      //Поиск следующей точки "_по часовой_ стрелке"

  CPoint NextDotCCW(const CPoint dot, int &vec);       //Поиск следующей точки "_против часовой_ стрелке"

  CPoint GetSize();                   //получение размера изображения

};


П.1.11. ТЕКСТ МОДУЛЯ TFingPicture.cpp

#include "StdAfx.h"

#include "TFingPicture.h"

///////////////////////////////////////////////////////////////////////////////

//Класс изображения.

//Хранение изображения, выполнение простейших операции над ним

///////////////////////////////////////////////////////////////////////////////

//координаты окружающих точек

const CPoint incXY[8]=

{

  CPoint(-1, -1),

  CPoint(0,  -1),

  CPoint(1,  -1),

  CPoint(1,  0),

  CPoint(1,  1),

  CPoint(0,  1),

  CPoint(-1, 1),

  CPoint(-1, 0)};

TFingPicture::TFingPicture(CDC *_Screen)

{

  Screen = _Screen;

  pic.CreateCompatibleDC(Screen);

  IsLoad = false;

}

TFingPicture::~TFingPicture(void){}

//отобразить изображение на окне в координатах (X,Y)

bool TFingPicture::Show(int X, int Y)

{

  if (!IsLoad) return false;

  int kx = bmp.bmWidth;

  int ky = bmp.bmHeight;

  return Screen->StretchBlt(X, Y, bmp.bmWidth, bmp.bmHeight, &pic, 0, 0,  kx, ky, SRCCOPY)>0;

}

//загрузить изображение из файла src

bool TFingPicture::Load(const CString src)

{   

  IsLoad = false;

  CBitmap bm;

  bm.Detach();

  IsLoad = bm.Attach(LoadImage(0, src, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE))>0;

  bm.GetObject(sizeof(BITMAP), &bmp);

  pic.SelectObject(&bm);

  return IsLoad;

}

// color = BGR;

bool TFingPicture::SetPixel(CPoint dot, COLORREF color)

{

  if (!IsLoad) return false;

  pic.SetPixel(dot.x, dot.y, color);

  return true;

}

bool TFingPicture::SetPixel(int x, int y, COLORREF color)

{

  if (!IsLoad) return false;

  pic.SetPixel(x, y, color);

  return true;

}

// color = BGR;

COLORREF TFingPicture::GetPixel(CPoint dot)

{

  if (!IsLoad) return false;

  return pic.GetPixel(dot.x, dot.y);

}

COLORREF TFingPicture::GetPixel(int x, int y)

{

  if (!IsLoad) return false;

  return pic.GetPixel(x, y);

}

bool TFingPicture::FloodFill(CPoint dot, COLORREF color)

{

  if(!IsLoad) return false;

  COLORREF col = GetPixel(dot);

  CBrush br(color);

  pic.SelectObject(&br);

  pic.ExtFloodFill(dot.x, dot.y, col, FLOODFILLSURFACE);

  return true;

}

bool TFingPicture::FloodFill(int x, int y, COLORREF color)

{

  if(!IsLoad) return false;

  COLORREF col = GetPixel(x, y);

  CBrush br(color);

  pic.SelectObject(&br);

  pic.ExtFloodFill(x, y, col, FLOODFILLSURFACE);

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.