void KalmanFilter::getX(double** K) {
  double* img = imgMatrix(H,X,2,3);
  double* subV = subVect(Y,img,2);

  free(img);
  img = imgMatrix(K,subV,3,2);

  free(subV);
  subV = NULL;

  double* tmp = addVect(X,img,3);

  free(img);
  img = NULL;
  free(X);
  X = tmp;

  tmp = NULL;
}
void KalmanFilter::getXPlus() {
  double* img = imgMatrix(A,X,3,3);
  free(X);
  X = img;
}
Ejemplo n.º 3
0
QString CardOCR::nominal(const QImage * img)
{
   img_ = new QImage(*img);
   //toBlackWhiteMid(*img_, 128);
   //img_->save("cc.bmp");
   BoolMatrix imgMatrix(img_);
   //1 проверка - не является ли это 10
   if (isTen(imgMatrix))
   {
      return "T";
   }
   //не является 10
   //разбиваем на замкнутые области
   QList<PointList> areas = closedAreas(imgMatrix);

   int cnt = areas.count();
   
   if (cnt > 2)
   {
      //произошла ошибка что-то нужно делать
      return QString();
   }

   if (cnt == 2)
   {
      //это может быть 8 или Q
      //сравниваем площади
      PointList list0 = areas.at(0);
      PointList list1 = areas.at(1);
      qreal c0 = list0.count();
      qreal c1 = list1.count();
      qreal q = 0;  
      if (c0 > c1)
         q = c0 / c1;
      else
         q = c1 / c0;
      if (q < 2.0)
      {
         //8
         return "8";
      }
   }

   //построить профиль слева
   QVector<ProfileItem> leftProfile = scanLeftProfile(imgMatrix);
   //построить профиль справа
   QVector<ProfileItem> rightProfile = scanRightProfile(imgMatrix);

   //получили картину профиля
   //foreach (ProfileItem item, leftProfile)
   //{
   //   qDebug() << item.item << item.value;
   //}
   //qDebug() << "------";
   //foreach (ProfileItem item, rightProfile)
   //{
   //   qDebug() << item.item << item.value;
   //}
   
   bool isLeftAce   = isAceProfile(leftProfile);
   bool isRightAce  = isAceProfile(rightProfile);

   if (isLeftAce && ((cnt >= 1) || isRightAce))
      return "A";

   bool isLeftQueen   = isLeftQueenProfile(leftProfile);
   bool isRightQueen  = isRightQueenProfile(rightProfile);
   bool isRightSix    = isSixProfile(rightProfile);
   
   if (isLeftQueen && isRightQueen && cnt >= 1)
      return "Q";
   if (isLeftQueen && isRightSix && cnt >= 1)
      return "Q";

   bool isLeftSix   = isSixProfile(leftProfile);
   //bool isRightSix  = isSixProfile(rightProfile);

   if (isLeftSix && cnt >= 1)
      return "6";

   if (isRightSix && cnt >= 1)
      return "9";

   bool isLeftTwo  = isLeftTwoProfile(leftProfile);
   bool isRightTwo = isRightTwoProfile(rightProfile);
   if (isLeftTwo && isRightTwo)
      return "2";

   bool isLeftFive  = isLeftFiveProfile(leftProfile);
   bool isRightFive = isRightFiveProfile(rightProfile);
   if (isLeftFive && isRightFive)
      return "5";

   bool isLeftJack  = isLeftJackProfile(leftProfile);
   bool isRightJack = isSixProfile(rightProfile);//так и задумано
   if (isLeftJack && isRightJack)
      return "J";
   
   bool isLeftKing  = isLeftKingProfile(leftProfile);
   bool isRightKing = isRightKingProfile(rightProfile);
   if (isLeftKing && isRightKing)
      return "K";

   //7 перед 3
   //построить профиль снизу
   QVector<ProfileItem> downProfile = scanDownProfile(imgMatrix);
   //qDebug() << "------------";
   //foreach (ProfileItem item, downProfile)
   //{
   //   qDebug() << item.item << item.value;
   //}
   
   bool isRightSeven = isRightSevenProfile(rightProfile);
   bool isDownSeven  = isDownSevenProfile(downProfile);
   bool isRightThree6 = isSixProfile(rightProfile);//так и задумано
   bool isRightThree3 = isRightThreeProfile(rightProfile);
   if (isRightSeven && isDownSeven && !isRightThree6)
   {
      return "7";
   }
   
   //осталась только тройка с таким правым профилем
   //bool isRightThree = isSixProfile(rightProfile);//так и задумано
   if (isRightThree3 || isRightThree6)
      return "3";

   bool isLeftFour = isLeftFourProfile(leftProfile);
   if (isLeftFour)
      return "4";

   return QString();
}