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

  if (A.x - B.x == 0)

  {

      if (A.y > B.y) alpha = M_PI_2;

      else alpha = -M_PI_2;

  }else

  {

      double a = ((double)A.y-B.y)/((double)B.x-A.x);

      alpha = atan(a);

      if (A.x > B.x)

      {

          if (alpha < 0) alpha += M_PI;

          else alpha -= M_PI;

          if (A.y == B.y) alpha = -M_PI;

      }

  }

  return alpha;

}

TCompareFing TRelFing::Compare(TRelFing &fng)

//сравнить отпечаток с отпечатком из файла

{

  TCompareFing ret;

  ret.nfng = (short)fng.size();

  const short CONFIRM_VAL = 9;

  const double DELTA_L = 10.0;         //ограничитель

  const double DELTA_A = 10.0;        //ограничитель


  short confirmDot = 0;     //количество совпавших СТ (спец точек)

  short confirmVal = 0;      //количество совпавших сопряженных СТ с текущей СТ

  short needVal = (short)(min(this->size(),fng.size())/3.0 +0.5);

    if(needVal > CONFIRM_VAL) needVal = CONFIRM_VAL;


  listTRelDot *surroundDots1, *surroundDots2;

  listTRelDot::iterator baseIter;

  for(TRelFing::iterator tekFing = this->begin();

      tekFing != this->end();

      tekFing++)

  {

      for(TRelFing::iterator baseFing = fng.begin();

          baseFing != fng.end();

          baseFing++)

      {

          confirmVal = 0;

          surroundDots1 = new(listTRelDot);

          surroundDots2 = new(listTRelDot);

          for(listTRelDot::iterator tekIter = (*tekFing).begin();

             tekIter != (*tekFing).end();

             tekIter++)

          {

             baseIter = (*baseFing).begin();

             short prev, next;

             prev = next = abs(baseIter->l - tekIter->l);

             while(

                 prev >= next &&

                 next >= DELTA_L &&

                 baseIter != (*baseFing).end())

             { 

                 prev = next;

                    baseIter++;

                 next = abs(baseIter->l - tekIter->l);

             }

             if(prev >= DELTA_L && prev < next) continue;   //нет смысла сравнивать дальше т.к. всегда будет next >= DELTA_L

             for(;

                 baseIter != (*baseFing).end();

                 baseIter++)

             {

                 int len = abs(tekIter->l - baseIter->l);

                 if(len >= DELTA_L) break;    //нет смысла сравнивать дальше т.к. всегда будет next >= DELTA_L

                 int delta_a = DELTA_A;

                 if(

                     ((abs(tekIter->a1 - baseIter->a1)<delta_a)||(abs(tekIter->a1 - baseIter->a1) > 360-delta_a))&&

                     ((abs(tekIter->a2 - baseIter->a2)<delta_a)||(abs(tekIter->a2 - baseIter->a2) > 360-delta_a)))

                 {

                     confirmVal++;


                     surroundDots1->push_back(*baseIter);

                     surroundDots2->push_back(*tekIter);


                     break;

                 }

             }

             if(confirmVal > needVal)

             { 

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

                 //удалим эту точку из последующего перебора, т.к. она уже совпала

                 ret.dots.push_back(TPairAbsDot(baseFing->back().absDot, tekFing->back().absDot));

                 ret.surdots.push_back(TPairSur(surroundDots1,surroundDots2));

                 baseFing->clear();

                 fng.erase(baseFing);

                 confirmDot++;

                 break;

             }

          }

            if(confirmVal > needVal){break;}

          else{

             ret.dots.push_back(TPairAbsDot(baseFing->back().absDot, tekFing->back().absDot));

             ret.surdots.push_back(TPairSur(surroundDots1,surroundDots2));


             surroundDots1->clear();

             surroundDots2->clear();

          }

      }

  }

  ret.cDot = confirmDot;

  ret.val = 0;

  return ret;

}

П.1.8 ТЕКСТ МОДУЛЯ TAnalysePicture.h

#pragma once

#include "TFingPicture.h"


//MESSAGEOUT отображать отладочную информацию с помощью popup окон

//#define MESSAGEOUT true

#define MESSAGEOUT false

#define OUT_FILE "fingAnalyserOut.txt"    //файл отчет

#define BLANK "blank.bmp"               //пустое изображение


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

//важные параметры для обхода изображения

#define LEN_S 3              //длина малого вектора (LEN_S точек)

#define LEN_L 4              //длина большого вектора (LEN_L малых векторов)

#define KOL_L 2             //необходимое количество больших векторов

#define KOL_S LEN_L*KOL_L  //необходимое количество точек

#define TEST_ALPHA 130.0   //тест на разворот вектора. Указывается угол в градусах

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


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

// Класс АНАЛИЗА ИЗОБРАЖЕНИЯ

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

class TAnalysePicture

{

private:

  TFingPicture *pic;      //Собственно сама картинка

  TFingPicture *tmpPic; //копия картинки

  TFingPicture *pic2;     //изображение для отображения в окне

  int height, width;  //высота и ширина изображения

  CString srcImg;       //путь к изображению

  int err;         //Код состояния картинки

  TInfo info;          //сопроводительная информация


private:

  int ChangeLine(list<TMapElDot>::iterator _dot, list<TMapElDot> &_map); //Обработка картинки, ее изменение

  TAbsFing ReadPic(list<TMapElDot>::iterator _dot);         //Нахождение на изображении спец точек

  list<TMapElDot> LookPic();                                //Сканирование картинки и нахождение линий на ней

  inline double GetAlpha(const CPoint A, const CPoint B);      //Направлени из точки А в В [-pi,pi)

  inline double GetS(CPoint A, CPoint B);                       //растояние между точками

  CPoint FindAcceptDot(CPoint dot, double alpha, bool type);   //Поиск продолжения из окончания/раздвоения

  bool TestFindDot(int _x, int _y);//тест точки: Разность направлений вперед и назад должно быть меньше 110 градусов

  double ChangeAlphaInterval(double _alpha);      //Приведение итрервала к [-pi,pi)

  int DotsFilter(TAbsFing &_dots);  

/*Фильтрование полученных точек отсеиваются близкостоящие направленные в противоположные строки

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

  bool LeftDot(TAbsFing::iterator &iter); 

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

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


public:

  TAnalysePicture(const CString src, CDC *screen);

  ~TAnalysePicture(void);

  int getErr();

  CString getErrMsg();

  CString getPathSrc(){return srcImg;};

  TAbsFing AnalysePicture();                           //Обработка загруженного изображения и получение образа

  bool Show(int x, int y, int xt=-1, int yt=-1);

  TFingPicture *GetPic1();

  TFingPicture *GetPic2();

};


П.1.9 ТЕКСТ МОДУЛЯ TAnalysePicture.cpp

#include "StdAfx.h"

#include "TAnalysePicture.h"


TAnalysePicture::TAnalysePicture(const CString src, CDC *screen)

{

  pic = new TFingPicture(screen);

  err = -1;

  if(!pic->Load(src)) err = 0;

  pic->Rectangle(CPoint(0, 0), pic->GetSize(), 10);

  srcImg = src;

  tmpPic = new TFingPicture(screen);

  tmpPic->Load(src);

  pic2 = new TFingPicture(screen);

  pic2->Load(BLANK);

}

TAnalysePicture::~TAnalysePicture(void)

{

  delete(tmpPic);

  delete(pic2);

  delete(pic);

}


//Код ошибки

int TAnalysePicture::getErr()

{

  return err;

}


//Сообщение ошибки

CString TAnalysePicture::getErrMsg()

{

  CString msg = "";

  switch (err)

  {

      case -1: {msg = "Ошибок при загрузке изображения нет"; break;}

      case 0: {msg = "Изображение не загружено"; break;}

      case 1: {msg = "Возникла ошибка при загрузке изображения"; break;}

      default: {msg = "Нераспознанная ошибка";}

  }

  return msg;

}


// Обработка загруженного изображения и получение образа

TAbsFing TAnalysePicture::AnalysePicture()

{

  TAbsFing ret, ret2;

  if(err != -1)

  {

      if(MESSAGEOUT) MessageBox(NULL, getErrMsg(), "Ошибка", MB_OK);

      return ret;

  }

  int prevCol;

  int changeN = 0;                 //Счетчик произведенных изменений на изображении

  list<TMapElDot> map;               //Карта точек принадлежащих линиям

  list<TMapElDot>::iterator imap;      //Итератор для map

  map = LookPic();                   //сканирование картинки и нахождение линий на ней

  do{

      changeN = 0;

      prevCol = (int)map.size();

      imap = map.begin();

      do{                                //Изображение можно модифицировать

          if(imap->pr1)       //Линия нуждается в обработке

             changeN += ChangeLine(imap, map); //Обработка (преобразование) изображения

          imap++;                             //Переход для обработки следующей линии

      }while(imap != map.end());             //Изображение можно модифицировать

  }while(prevCol<0.1*map.size());            //Изображение можно модифицировать


  map = LookPic();                   //сканирование картинки и нахождение линий на ней

  imap = map.begin();

  do{                                //Изображение можно модифицировать

Страницы: 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 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.