#include "opencv2/opencv.hpp" #include #include #include "math.hpp" int filter(const cv::Mat& img, cv::Mat output, int seuil) { bool detect = false; uchar R, G, B; int rows = img.rows; int cols = img.cols; int dim = img.channels(); int indexNB; for (int index=0,indexNB=0;indexG) && (R>B)) if (((R-B)>=seuil) || ((R-G)>=seuil)) detect=1; if (detect==1) output.data[indexNB]=255; else output.data[indexNB]=0; } } int main(int argc, char** argv) { int seuil=0; if (argc > 1) { seuil = atol(argv[1]); } int cmax = 10; int N = 5000; char detect; cv::VideoCapture cap(0); if(!cap.isOpened()) return -1; cv::namedWindow("Image",1); cv::namedWindow("Detection",1); cv::namedWindow("Contours",1); while(true) { int X, Y, DIM, index; unsigned int numc; uchar R, G, B; std::vector> contours; std::vector hierarchy; cv::Mat frame; cap >> frame; X=frame.rows; Y=frame.cols; cv::Mat binaire(X,Y,CV_8UC1); cv::imshow("Image", frame); cv::GaussianBlur(frame, frame, cv::Size(7,7), 1.5, 1.5); X=frame.rows; Y=frame.cols; DIM=frame.channels(); filter(frame, binaire, seuil); cv::imshow("Detection", binaire); cv::findContours(binaire, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); cv::Mat Dessin = cv::Mat::zeros(X,Y, CV_8UC1); int id = math::max_cont(contours); std::cout << contours[id].size() << std::endl; std::vector new_cont = math::simplify_contour(contours[id], cmax); cv::drawContours(Dessin, contours, id, 255); cv::drawContours(Dessin, new_cont, id, 255); cv::imshow("Contours", Dessin); if(cv::waitKey(30) == 27) { break; } } return 0; }