#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    Mat image, gray, edges;
    int cannyThresh = 1;
    int accuThresh = 1;

    VideoCapture camera(0);
    if (!camera.isOpened()) return -1;

    namedWindow("edges",1);
    createTrackbar("Canny threshold", "edges", &cannyThresh, 255);
    namedWindow("circles",1);
    createTrackbar("Accu threshold", "circles", &accuThresh, 255);

    for (;;) {

         camera >> image;
        if (image.empty()) return -1;
        cvtColor(image,gray,CV_BGR2GRAY);
        GaussianBlur(gray,gray,Size(9,9),2,2);
        Canny(gray,edges,MAX((double)cannyThresh/2,1),MAX((double)cannyThresh,1),3);
        vector<Vec3f> circles;
        HoughCircles(gray,circles,CV_HOUGH_GRADIENT,1,gray.rows/8,MAX((double)cannyThresh,1),MIN(MAX((double)accuThresh,1),MAX((double)cannyThresh,1)),10,gray.rows/3);
        cout << circles.size() << endl;

        for (int i = 0; i < circles.size(); i++) {
            Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
            int radius = cvRound(circles[i][2]);
            circle(image,center,3,Scalar(0,255,0),-1);
            circle(image,center,radius,Scalar(0,0,255),3);
        }

        imshow("edges",edges);
        imshow("circles",image);

        int key = waitKey(100);
        if (key != -1) break;
    }
    return 0;
}
