#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
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<klatka.rows; ++h)
{
for(int w=0; w<klatka.cols; ++w)
{
if(klatka.at<Vec3b>(h,w) != Vec3b(0,0,0) && klatka.at<Vec3b>(h,w) != Vec3b(0,0,255))
{
klatka.at<Vec3b>(h,w) = Vec3b(255,255,255);
}
}
}
for(int h=0; h<klatka.rows; ++h)
{
for(int w=0; w<klatka.cols; ++w)
{
if(klatka.at<Vec3b>(h,w) == Vec3b(0,0,255))
{
klatka.at<Vec3b>(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<vector<Point> > 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<Point> 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<<kontury.size()<<endl;
float area = contourArea(kontury[i], true); //bool orientacja
if (area > 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()<<endl;
vector<Point>::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<vector<Point> > 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<kontury.size()-1; i++)
{
//cout<<kontury.size()<<endl;
float area = contourArea(kontury[i], true);
if (area > 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;
}