#include #include #include using namespace std; using namespace cv; void wyznaczeniePunktu(int event, int x, int y, int flags, void *userdata) { Point aktualnaPozycja = Point(x, y); Point lewyPrzycisk; if(event == EVENT_LBUTTONDOWN) { cout << "Pozycja kursora:" << endl; aktualnaPozycja = lewyPrzycisk; cout << "x = "<< x << '\t' << "y = " << y << endl; } } int wczytajWyswietl(Mat &klatka) { VideoCapture cap("/home/filip/Pulpit/poker/4.mp4"); if(!cap.isOpened()) //czy otwarte { return -1; } klatka; cap >> klatka; Size size(1200, 700); //pomniejszenie resize(klatka, klatka, size); imshow("okno_start", klatka); setMouseCallback("okno_start", wyznaczeniePunktu); //wyznaczenie puntku maski waitKey(0); Mat maska(klatka.rows, klatka.cols, CV_8UC1); //zrobienie maski, wymiary klatki, zapis 8-bitowy maska.setTo(255); //ustawienie pixeli maski na biały rectangle(maska, Point(539, 436), Point(656, 478), Scalar(0), -1); //Scalar(0) - ustawienie koloru czarny, -1 - wypełnienie prostokąta Mat klatkaZmaska = klatka.clone(); klatkaZmaska.setTo(255, maska); //zastąpiene kolorem białym wszystkiego poza obszarem maski /*imshow("maska", maska); setMouseCallback("maska", wyznaczeniePunktu); waitKey(0);*/ imshow("klatkaZmaska", klatkaZmaska); waitKey(0); cap.release(); destroyAllWindows(); klatka = klatkaZmaska; } int kolorki(Mat klatka); int morfologia(Mat klatka, int xErode, int yErode, int xDilate, int yDilate); int koloryFigur(Mat klatka, string tab[]); int wartosciFigur(Mat klatka, string tab[]); int progowanie(Mat klatka, int prog, int ponadProg, int wybor, string tab[]) { threshold(klatka, klatka, prog, ponadProg, THRESH_BINARY); // wszystko co ponad próg 100, przyjmuje wartość 255 imshow("Progowanie", klatka); waitKey(0); kolorki(klatka); if(wybor == 1) { morfologia(klatka, 5, 4, 2, 1); koloryFigur(klatka, tab); } else if(wybor == 2) { morfologia(klatka, 2, 4, 2, 2); wartosciFigur(klatka, tab); } destroyAllWindows(); } int kolorki(Mat klatka) { for(int h=0; h(h,w) != Vec3b(0,0,0) && klatka.at(h,w) != Vec3b(0,0,255)) { klatka.at(h,w) = Vec3b(255,255,255); } } } for(int h=0; h(h,w) == Vec3b(0,0,255)) { klatka.at(h,w) = Vec3b(0,0,0); } } } imshow("Kolorki", klatka); waitKey(0); } int morfologia(Mat klatka, int xErode, int yErode, int xDilate, int yDilate) { blur(klatka, klatka, Size(1,1)); Mat kernelErode = getStructuringElement(MORPH_ELLIPSE, Size(xErode,yErode)); Mat kernelDilate = getStructuringElement(MORPH_ELLIPSE, Size(xDilate,yDilate)); erode(klatka, klatka, kernelErode); dilate(klatka, klatka, kernelDilate); imshow("Morfo", klatka); waitKey(0); } int koloryFigur(Mat klatka, string tab[]){ cvtColor(klatka, klatka, CV_BGR2GRAY); vector > kontury; findContours(klatka, kontury, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); //retr_list - kontury bez żadnej hierarchii, chain_approxv zostawia końcówki np. boków w postaci punktów vector approxkontury; string kolor1, kolor2, kolorTmp; int ileKontur = 0; int licznik = 0; const int skalaraSzarosci = 50; int licznikSzarosci = 1; for(int i = 0; i < kontury.size()-1; i++) { //cout< 162) { drawContours(klatka, kontury, i, Scalar(50+(licznikSzarosci*skalaraSzarosci),50+(licznikSzarosci*skalaraSzarosci),50+(licznikSzarosci*skalaraSzarosci)), CV_FILLED); ileKontur++; licznikSzarosci++; //cout << "Wielkość konturu\t" << area << endl; approxPolyDP(kontury[i], approxkontury, 0.03*arcLength(Mat(kontury[i]), true), true); //epsilon - najdalszy punkt między pierwotną a approx, true - vector zamknięty //cout<< "Liczba kątów:\t" << approxkontury.size()<::iterator wierzcholek; for(wierzcholek = approxkontury.begin(); wierzcholek != approxkontury.end(); ++wierzcholek) { circle(klatka, *wierzcholek, 3, Scalar(255,255,255), 1); } if(licznik < 2) { if(approxkontury.size() == 5) { //cout << "karo\n"; kolorTmp = "karo"; } else if(approxkontury.size() == 6) { //cout << "serce\n"; kolorTmp = "serce"; } else if(approxkontury.size() == 8) { //cout << "pik\n"; kolorTmp = "pik"; } else { //cout << "trefl\n"; kolorTmp = "trefl"; } if(licznik == 0) kolor1 = kolorTmp; else kolor2 = kolorTmp; licznik++; } } } //cout << "Liczba kontur" << '\t' << ileKontur << endl; imshow("KoloryFigur", klatka); waitKey(0); tab[0] = kolor1; tab[1] = kolor2; } int wartosciFigur(Mat klatka, string tab[]){ cvtColor(klatka, klatka, CV_BGR2GRAY); vector > kontury; findContours(klatka, kontury, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); string figura1, figura2, figuraTmp; int ileKontur = 0; int licznik = 0; const int skalaraSzarosci = 50; int licznikSzarosci = 1; for(int i = 0; i 95 && area < 176) { drawContours(klatka, kontury, i, Scalar(50+(licznikSzarosci*skalaraSzarosci),50+(licznikSzarosci*skalaraSzarosci),50+(licznikSzarosci*skalaraSzarosci)), CV_FILLED); ileKontur++; licznikSzarosci++; //cout << "Wielkość konturu\t" << area << endl; licznik++; if(licznik > 2 && licznik <= 4) { if(area > 144 && area <= 151.5) { //cout << "AS\n"; figuraTmp = "AS"; } else if(area > 99 && area <= 110) { //cout << "JOPEK\n"; figuraTmp = "JOPEK"; } else if(area > 170 && area <= 175) { //cout << "9\n"; figuraTmp = "9"; } else if(area > 130 && area <= 135) { //cout << "10\n"; figuraTmp = "10"; } else if(area > 156 && area <= 159) { //cout << "8\n"; figuraTmp = "8"; } else if(area > 151.5 && area <= 155) { //cout << "K\n"; figuraTmp = "KROL"; } if(licznik == 3) figura1 = figuraTmp; else figura2 = figuraTmp; } } } //cout << "Liczba kontur" << '\t' << ileKontur << endl; imshow("WartosciFigur", klatka); waitKey(0); tab[0] = figura1; tab[1] = figura2; } const int N = 2; int main(int argc, char** argv) { Mat poker; Mat poker2; string kolory[N]; string figury[N]; wczytajWyswietl(poker); progowanie(poker, 53, 255, 1, kolory); wczytajWyswietl(poker2); progowanie(poker2, 90, 255, 2, figury); cout << figury[1] << '\t' << kolory[1] << endl << endl; cout << figury[0] << '\t' << kolory[0] << endl; return 0; }