Search code examples
c++opencvhough-transformtrackbar

opencv HoughCircle and trackbar


I am looking into the Hough Circle function. There are basically 4 parameters that i can play with to get the correct circle I wish.

So it come to my mind that I want to create a trackbar to monitor the status of the image being processed.

So I altered my code like this

#include <sstream>
#include <string>
#include <iostream>
#include <vector>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;
using namespace cv;


int main(int argc, char** argv) {

//Create a window for trackbars
namedWindow("Trackbar Window", CV_WINDOW_AUTOSIZE);

//Create trackbar to change brightness
int iSliderValue1 = 50;
createTrackbar("Brightness", "Trackbar Window", &iSliderValue1, 100);

//Create trackbar to change contrast
int iSliderValue2 = 50;
createTrackbar("Contrast", "Trackbar Window", &iSliderValue2, 100);

int param1 = 10;
createTrackbar("param1", "Trackbar Window", &param1, 300);

int param2 = 10;
createTrackbar("param2", "Trackbar Window", &param2, 300);



Mat src;

VideoCapture capture;

capture.open("movingBall.wmv");
capture.read(src);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
capture.set(CV_CAP_PROP_FRAME_WIDTH, 640);


if (!src.data) {
    std::cout << "ERROR:\topening image" << std::endl;
    return -1;
}
cv::namedWindow("image1", CV_WINDOW_AUTOSIZE);

cv::namedWindow("image2", CV_WINDOW_AUTOSIZE);

while (true){

    capture.read(src);
    Mat dst;
    int iBrightness = iSliderValue1 - 50;
    double dContrast = iSliderValue2 / 50.0;

    src.convertTo(src, -1, dContrast, iBrightness);

cv::imshow("image1", src);

Mat src_gray2;
cvtColor(src, src_gray2, CV_BGR2GRAY);

GaussianBlur(src_gray2, src_gray2, cv::Size(9, 9), 2, 2);

vector<Vec3f> circles;

HoughCircles(src_gray2, circles, CV_HOUGH_GRADIENT,
    2,   // accumulator resolution (size of the image / 2)
    5,  // minimum distance between two circles
    param1, // Canny high threshold
    param2, // minimum number of votes
    0, 0); // min and max radius

std::cout << circles.size() << std::endl;
std::cout << "end of test" << std::endl;


for (size_t i = 0; i < circles.size(); i++)
{
    Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
    int radius = cvRound(circles[i][2]);
    circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    // circle outline
    circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);
}

/*std::vector<cv::Vec3f>::
    const_iterator itc = circles.begin();

while (itc != circles.end()) {

    cv::circle(src_gray2,
        cv::Point((*itc)[0], (*itc)[1]), // circle centre
        (*itc)[2],       // circle radius
        cv::Scalar(0,0,0), // color
        2);              // thickness

    ++itc;
}*/

cv::imshow("image2", src_gray2);

cvWaitKey(33);
}
return 0;
}

As seen at the Hough Circle function there, i used int param1; as the value i wish to change. However, the code has no syntax errors but it is unable to be compiled. I wish to know if is there something wrong with my trackbar setup.. Thank you


Solution

  • Here i have tried it using Python you can try to port from it...

    import cv2
    import numpy as np
    
    img = cv2.imread('C:/Python34/images/2.jpg',0)
    cv2.namedWindow('image')
    def nothing(x):
        pass
    cv2.createTrackbar('Param 1','image',0,100,nothing)
    cv2.createTrackbar('Param 2','image',0,100,nothing)
    switch = '0 : OFF \n1 : ON'
    cv2.createTrackbar(switch, 'image',0,1,nothing)
    
    while(1):
        cv2.imshow('image',img)
        k = cv2.waitKey(1) & 0xFF
        if k == 27:
            break
        #To Get Parameter values from Trackbar Values
        para1 = cv2.getTrackbarPos('Param 1','image')
        para2 = cv2.getTrackbarPos('Param 2','image')
        s = cv2.getTrackbarPos(switch,'image')
        if s == 0:
            cv2.imshow('image', img)
        else:
        #For finding Hough Circles according to trackbar parameters
            circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,para1,para2,minRadius=0,maxRadius=0)
            circles = np.uint16(np.around(circles))
            #For drawing Hough Circles
            for i in circles[0,:]:
               cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)
               cv2.circle(img,(i[0],i[1]),2,(0,0,255),3)
               cv2.imshow('image', img)
            cv2.waitKey(0)
            img = cv2.imread('C:/Python34/images/2.jpg',0)
    
    
    cv2.destroyAllWindows()
    

    You can use the above code as your refrence, firstly it creates a window and trackbars for switch and two parameter for hough circle. then in the while loop para1 and para2 will store position of trackbars as value of canny parameter. this is then used in cv2.HoughCircles function and the circles are drawn. the image is again loaded so that every time you change parameter the output is given on fresh image to avoid confusing.

    hope this might be useful.