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; }
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(); }