Facebook
From Filip, 5 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 240
  1. #include <iostream>
  2. #include <opencv2/opencv.hpp>
  3. #include <opencv2/highgui/highgui.hpp>
  4.  
  5. using namespace std;
  6. using namespace cv;
  7.  
  8. void wyznaczeniePunktu(int event, int x, int y, int flags, void *userdata)
  9. {
  10.     Point aktualnaPozycja = Point(x, y);
  11.  
  12.     Point lewyPrzycisk;
  13.  
  14.  
  15.     if(event == EVENT_LBUTTONDOWN)
  16.     {
  17.         cout << "Pozycja kursora:" << endl;
  18.         aktualnaPozycja = lewyPrzycisk;
  19.         cout << "x = "<< x << '\t' << "y = " << y << endl;
  20.     }
  21. }
  22.  
  23. int wczytajWyswietl(Mat &klatka)
  24. {
  25.     VideoCapture cap("/home/filip/Pulpit/poker/4.mp4");
  26.  
  27.  
  28.     if(!cap.isOpened())             //czy otwarte
  29.     {
  30.         return -1;
  31.     }
  32.  
  33.     klatka;
  34.  
  35.     cap >> klatka;
  36.  
  37.     Size size(1200, 700);           //pomniejszenie
  38.     resize(klatka, klatka, size);
  39.  
  40.     imshow("okno_start", klatka);
  41.  
  42.     setMouseCallback("okno_start", wyznaczeniePunktu);      //wyznaczenie puntku maski
  43.  
  44.     waitKey(0);
  45.  
  46.     Mat maska(klatka.rows, klatka.cols, CV_8UC1);        //zrobienie maski, wymiary klatki, zapis 8-bitowy
  47.     maska.setTo(255);                                           //ustawienie pixeli maski na biały
  48.     rectangle(maska, Point(539, 436), Point(656, 478), Scalar(0), -1);      //Scalar(0) - ustawienie koloru czarny, -1 - wypełnienie prostokąta
  49.     Mat klatkaZmaska = klatka.clone();
  50.     klatkaZmaska.setTo(255, maska);                   //zastąpiene kolorem białym wszystkiego poza obszarem maski
  51.  
  52.     /*imshow("maska", maska);
  53.  
  54.     setMouseCallback("maska", wyznaczeniePunktu);
  55.  
  56.     waitKey(0);*/
  57.  
  58.     imshow("klatkaZmaska", klatkaZmaska);
  59.     waitKey(0);
  60.  
  61.     cap.release();
  62.  
  63.     destroyAllWindows();
  64.  
  65.     klatka = klatkaZmaska;
  66. }
  67.  
  68. int kolorki(Mat klatka);
  69. int morfologia(Mat klatka, int xErode, int yErode, int xDilate, int yDilate);
  70.  
  71. int koloryFigur(Mat klatka, string tab[]);
  72. int wartosciFigur(Mat klatka, string tab[]);
  73.  
  74.  
  75. int progowanie(Mat klatka, int prog, int ponadProg, int wybor, string tab[])
  76. {
  77.     threshold(klatka, klatka, prog, ponadProg, THRESH_BINARY);     // wszystko co ponad próg 100, przyjmuje wartość 255
  78.     imshow("Progowanie", klatka);
  79.      waitKey(0);
  80.     kolorki(klatka);
  81.  
  82.     if(wybor == 1)
  83.     {
  84.         morfologia(klatka, 5, 4, 2, 1);
  85.         koloryFigur(klatka, tab);
  86.     }
  87.     else if(wybor == 2)
  88.     {
  89.         morfologia(klatka, 2, 4, 2, 2);
  90.         wartosciFigur(klatka, tab);
  91.     }
  92.     destroyAllWindows();
  93. }
  94.  
  95.  
  96. int kolorki(Mat klatka)
  97. {
  98.     for(int h=0; h<klatka.rows; ++h)
  99.     {
  100.         for(int w=0; w<klatka.cols; ++w)
  101.         {
  102.             if(klatka.at<Vec3b>(h,w) != Vec3b(0,0,0) && klatka.at<Vec3b>(h,w) != Vec3b(0,0,255))
  103.             {
  104.                 klatka.at<Vec3b>(h,w) = Vec3b(255,255,255);
  105.             }
  106.         }
  107.     }
  108.     for(int h=0; h<klatka.rows; ++h)
  109.     {
  110.         for(int w=0; w<klatka.cols; ++w)
  111.         {
  112.             if(klatka.at<Vec3b>(h,w) == Vec3b(0,0,255))
  113.             {
  114.                 klatka.at<Vec3b>(h,w) = Vec3b(0,0,0);
  115.             }
  116.         }
  117.     }
  118.     imshow("Kolorki", klatka);
  119.     waitKey(0);
  120. }
  121.  
  122. int morfologia(Mat klatka, int xErode, int yErode, int xDilate, int yDilate)
  123. {
  124.     blur(klatka, klatka, Size(1,1));
  125.     Mat kernelErode = getStructuringElement(MORPH_ELLIPSE, Size(xErode,yErode));
  126.     Mat kernelDilate = getStructuringElement(MORPH_ELLIPSE, Size(xDilate,yDilate));
  127.  
  128.     erode(klatka, klatka, kernelErode);
  129.     dilate(klatka, klatka, kernelDilate);
  130.  
  131.  
  132.     imshow("Morfo", klatka);
  133.     waitKey(0);
  134. }
  135.  
  136. int koloryFigur(Mat klatka, string tab[]){
  137.  
  138.     cvtColor(klatka, klatka, CV_BGR2GRAY);
  139.  
  140.     vector<vector<Point> > kontury;
  141.     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
  142.     vector<Point> approxkontury;
  143.     string kolor1, kolor2, kolorTmp;
  144.  
  145.     int ileKontur = 0;
  146.     int licznik = 0;
  147.     const int skalaraSzarosci = 50;
  148.     int licznikSzarosci = 1;
  149.     for(int i = 0; i < kontury.size()-1; i++)
  150.     {
  151.         //cout<<kontury.size()<<endl;
  152.         float area = contourArea(kontury[i], true); //bool orientacja
  153.             if (area > 162)
  154.             {
  155.                 drawContours(klatka, kontury, i, Scalar(50+(licznikSzarosci*skalaraSzarosci),50+(licznikSzarosci*skalaraSzarosci),50+(licznikSzarosci*skalaraSzarosci)), CV_FILLED);
  156.  
  157.                 ileKontur++;
  158.                 licznikSzarosci++;
  159.                 //cout << "Wielkość konturu\t" << area << endl;
  160.  
  161.                 approxPolyDP(kontury[i], approxkontury, 0.03*arcLength(Mat(kontury[i]), true), true);  //epsilon - najdalszy punkt między pierwotną a approx, true - vector zamknięty
  162.                 //cout<< "Liczba kątów:\t" << approxkontury.size()<<endl;
  163.                 vector<Point>::iterator wierzcholek;
  164.                 for(wierzcholek = approxkontury.begin(); wierzcholek != approxkontury.end(); ++wierzcholek)
  165.                 {
  166.                     circle(klatka, *wierzcholek, 3, Scalar(255,255,255), 1);
  167.                 }
  168.                 if(licznik < 2)
  169.                 {
  170.                     if(approxkontury.size() == 5)
  171.                     {
  172.                         //cout << "karo\n";
  173.                         kolorTmp = "karo";
  174.                     }
  175.                     else if(approxkontury.size() == 6)
  176.                     {
  177.                         //cout << "serce\n";
  178.                         kolorTmp = "serce";
  179.                     }
  180.                     else if(approxkontury.size() == 8)
  181.                     {
  182.                         //cout << "pik\n";
  183.                         kolorTmp = "pik";
  184.                     }
  185.                     else
  186.                     {
  187.                         //cout << "trefl\n";
  188.                         kolorTmp = "trefl";
  189.                     }
  190.                     if(licznik == 0)  
  191.                         kolor1 = kolorTmp;
  192.                     else
  193.                         kolor2 = kolorTmp;
  194.                     licznik++;
  195.                 }
  196.             }
  197.     }
  198.     //cout << "Liczba kontur" << '\t' << ileKontur << endl;
  199.  
  200.     imshow("KoloryFigur", klatka);
  201.     waitKey(0);
  202.  
  203.     tab[0] = kolor1;
  204.     tab[1] = kolor2;
  205. }
  206.  
  207. int wartosciFigur(Mat klatka, string tab[]){
  208.  
  209.     cvtColor(klatka, klatka, CV_BGR2GRAY);
  210.  
  211.     vector<vector<Point> > kontury;
  212.     findContours(klatka, kontury, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
  213.  
  214.     string figura1, figura2, figuraTmp;
  215.     int ileKontur = 0;
  216.     int licznik = 0;
  217.     const int skalaraSzarosci = 50;
  218.     int licznikSzarosci = 1;
  219.     for(int i = 0; i<kontury.size()-1; i++)
  220.     {
  221.         //cout<<kontury.size()<<endl;
  222.         float area = contourArea(kontury[i], true);
  223.             if (area > 95 && area < 176)
  224.             {
  225.                 drawContours(klatka, kontury, i, Scalar(50+(licznikSzarosci*skalaraSzarosci),50+(licznikSzarosci*skalaraSzarosci),50+(licznikSzarosci*skalaraSzarosci)), CV_FILLED);
  226.  
  227.                 ileKontur++;
  228.                 licznikSzarosci++;
  229.                 //cout << "Wielkość konturu\t" << area << endl;
  230.                 licznik++;
  231.                 if(licznik > 2 && licznik <= 4)
  232.                 {
  233.                     if(area > 144 && area <= 151.5)
  234.                     {
  235.                         //cout << "AS\n";
  236.                         figuraTmp = "AS";
  237.                     }
  238.                     else if(area > 99 && area <= 110)
  239.                     {
  240.                         //cout << "JOPEK\n";
  241.                         figuraTmp = "JOPEK";
  242.                     }
  243.                     else if(area > 170 && area <= 175)
  244.                     {
  245.                         //cout << "9\n";
  246.                         figuraTmp = "9";
  247.                     }
  248.                     else if(area > 130 && area <= 135)
  249.                     {
  250.                         //cout << "10\n";
  251.                         figuraTmp = "10";
  252.                     }
  253.                     else if(area > 156 && area <= 159)
  254.                     {
  255.                         //cout << "8\n";
  256.                         figuraTmp = "8";
  257.                     }
  258.                     else if(area > 151.5 && area <= 155)
  259.                     {
  260.                         //cout << "K\n";
  261.                         figuraTmp = "KROL";
  262.                     }
  263.                     if(licznik == 3)
  264.                         figura1 = figuraTmp;
  265.                     else
  266.                         figura2 = figuraTmp;
  267.                 }
  268.             }
  269.     }
  270.     //cout << "Liczba kontur" << '\t' << ileKontur << endl;
  271.  
  272.     imshow("WartosciFigur", klatka);
  273.     waitKey(0);
  274.  
  275.     tab[0] = figura1;
  276.     tab[1] = figura2;
  277. }
  278.  
  279. const int N = 2;
  280.  
  281. int main(int argc, char** argv)
  282. {
  283.     Mat poker;
  284.     Mat poker2;
  285.     string kolory[N];
  286.     string figury[N];
  287.  
  288.     wczytajWyswietl(poker);
  289.     progowanie(poker, 53, 255, 1, kolory);
  290.     wczytajWyswietl(poker2);
  291.     progowanie(poker2, 90, 255, 2, figury);
  292.  
  293.     cout << figury[1] << '\t' << kolory[1] << endl << endl;
  294.     cout << figury[0] << '\t' << kolory[0] << endl;
  295.  
  296.     return 0;
  297. }
  298.