How exactly does the dp parameter in the houghcircle function in the opencv library work?

I am trying to understand the function and I am not quite sure how it affects the results. .houghcircles()

dp

Picking up http://docs.opencv.org/modules/imgproc/doc/feature_detection.html?highlight=houghcircles#houghcircles it says:

dp

- the inverse ratio of the resolution of the battery to the image For example, if the dp=1

battery has the same resolution as the input image.
If dp=2

, the sum of the accumulator is half the width and height.

Let's say you have a 1000x1000 image. Then you set dp to 3 so the battery only sees 1/3 of the image? Or is it something like, the image size remains the same but the number of pixels is smaller? those. when 3 pixels of the original image correlate with 1 pixel that the drive sees, for example, the original image is "blurry"?

I was able to pinpoint the exact number of red apples in a bowl by understanding other parameters and then tinker with dp

.

Perhaps my understanding of accumulator is wrong since they are correlated? From what I understand this is the number of times the region has "hit", but I'm not sure how it calculates the "hit area"

My code takes a bowl of apples, converts to HSV, captures reddish hues, converts it to black or white (not grayscale) using bitWiseOr, then does some .erode()

/ .dilate()

to reduce noise, then .houghcircles()

.

The resulting image looks like this http://i.imgur.com/iGyr7TG.jpgenter image description here

Thanks in advance.

+3


source to share


1 answer


Verba Associate Professor,
Exempla trahunt.

Best Image in Interactive GUI

Configurable UI panel allows you to customize the parameter (s) by moving multiple sliders




import sys
import cv2
import math
import numpy
from scipy.ndimage import label
pi_4 = 4*math.pi

def nothing_asCallback(x):
    pass

def GUI_openCV_circles():
    # --------------------------------------------------------------------------------GUI-<image>
    frame = cv2.imread(  "openCV_CircleDetection_IMG_LASSO_AREA.JPG" )
    demo  = frame[:800,:800,:]
    # --------------------------------------------------------------------------------GUI-<window>-s
    cv2.namedWindow( "DEMO.IN",             cv2.cv.CV_WINDOW_AUTOSIZE )
    cv2.namedWindow( "DEMO.Canny",          cv2.cv.CV_WINDOW_AUTOSIZE )
    cv2.namedWindow( "DEMO.Canny.Circles",  cv2.cv.CV_WINDOW_AUTOSIZE )
    # --------------------------------------------------------------------------------GUI-<state>-initial-value(s)
    aKeyPRESSED                                     = None              # .init

    aCanny_LoTreshold                               = 127
    aCanny_LoTreshold_PREVIOUS                      =  -1
    aCanny_HiTreshold                               = 255
    aCanny_HiTreshold_PREVIOUS                      =  -1

    aHough_dp                                       =   1
    aHough_dp_PREVIOUS                              =  -1
    aHough_minDistance                              =  10
    aHough_minDistance_PREVIOUS                     =  -1
    aHough_param1_aCannyHiTreshold                  = 255
    aHough_param1_aCannyHiTreshold_PREVIOUS         =  -1
    aHough_param2_aCentreDetectTreshold             =  20
    aHough_param2_aCentreDetectTreshold_PREVIOUS    =  -1
    aHough_minRadius                                =  10
    aHough_minRadius_PREVIOUS                       =  -1
    aHough_maxRadius                                =  30
    aHough_maxRadius_PREVIOUS                       =  -1
    # --------------------------------------------------------------------------------GUI-<ACTOR>-s
    cv2.createTrackbar( "Lo_Treshold",          "DEMO.Canny",          aCanny_LoTreshold,                      255, nothing_asCallback )
    cv2.createTrackbar( "Hi_Treshold",          "DEMO.Canny",          aCanny_HiTreshold,                      255, nothing_asCallback )

    cv2.createTrackbar( "dp",                   "DEMO.Canny.Circles",  aHough_dp,                              255, nothing_asCallback )
    cv2.createTrackbar( "minDistance",          "DEMO.Canny.Circles",  aHough_minDistance,                     255, nothing_asCallback )
    cv2.createTrackbar( "param1_HiTreshold",    "DEMO.Canny.Circles",  aHough_param1_aCannyHiTreshold,         255, nothing_asCallback )
    cv2.createTrackbar( "param2_CentreDetect",  "DEMO.Canny.Circles",  aHough_param2_aCentreDetectTreshold,    255, nothing_asCallback )
    cv2.createTrackbar( "minRadius",            "DEMO.Canny.Circles",  aHough_minRadius,                       255, nothing_asCallback )
    cv2.createTrackbar( "maxRadius",            "DEMO.Canny.Circles",  aHough_maxRadius,                       255, nothing_asCallback )

    cv2.imshow( "DEMO.IN",          demo )                              # static ...
    # --------------------------------------------------------------------------------GUI-mainloop()
    print " --------------------------------------------------------------------------- press [ESC] to exit "
    while( True ):
        # --------------------------------------------------------------------------------GUI-[ESCAPE]?
        if aKeyPRESSED == 27:
            break
        # --------------------------------------------------------------------------------<vars>-DETECT-delta(s)
        aCanny_LoTreshold = cv2.getTrackbarPos( "Lo_Treshold", "DEMO.Canny" )
        aCanny_HiTreshold = cv2.getTrackbarPos( "Hi_Treshold", "DEMO.Canny" )

        if (    aCanny_LoTreshold      != aCanny_LoTreshold_PREVIOUS
            or  aCanny_HiTreshold      != aCanny_HiTreshold_PREVIOUS
            ):
            # --------------------------= FLAG
            aCannyRefreshFLAG           = True
            # --------------------------= RE-SYNC
            aCanny_LoTreshold_PREVIOUS  = aCanny_LoTreshold
            aCanny_HiTreshold_PREVIOUS  = aCanny_HiTreshold
        else:
            # --------------------------= Un-FLAG
            aCannyRefreshFLAG           = False

        aHough_dp                           = cv2.getTrackbarPos( "dp",                 "DEMO.Canny.Circles" )
        aHough_minDistance                  = cv2.getTrackbarPos( "minDistance",        "DEMO.Canny.Circles" )
        aHough_param1_aCannyHiTreshold      = cv2.getTrackbarPos( "param1_HiTreshold",  "DEMO.Canny.Circles" )
        aHough_param2_aCentreDetectTreshold = cv2.getTrackbarPos( "param2_CentreDetect","DEMO.Canny.Circles" )
        aHough_minRadius                    = cv2.getTrackbarPos( "minRadius",          "DEMO.Canny.Circles" )
        aHough_maxRadius                    = cv2.getTrackbarPos( "maxRadius",          "DEMO.Canny.Circles" )

        if (    aHough_dp                            != aHough_dp_PREVIOUS
            or  aHough_minDistance                   != aHough_minDistance_PREVIOUS
            or  aHough_param1_aCannyHiTreshold       != aHough_param1_aCannyHiTreshold_PREVIOUS
            or  aHough_param2_aCentreDetectTreshold  != aHough_param2_aCentreDetectTreshold_PREVIOUS    
            or  aHough_minRadius                     != aHough_minRadius_PREVIOUS
            or  aHough_maxRadius                     != aHough_maxRadius_PREVIOUS
            ):
            # --------------------------= FLAG
            aHoughRefreshFLAG           = True                  
            # ----------------------------------------------= RE-SYNC
            aHough_dp_PREVIOUS                              =  aHough_dp                          
            aHough_minDistance_PREVIOUS                     =  aHough_minDistance                 
            aHough_param1_aCannyHiTreshold_PREVIOUS         =  aHough_param1_aCannyHiTreshold     
            aHough_param2_aCentreDetectTreshold_PREVIOUS    =  aHough_param2_aCentreDetectTreshold
            aHough_minRadius_PREVIOUS                       =  aHough_minRadius                   
            aHough_maxRadius_PREVIOUS                       =  aHough_maxRadius                   
        else:
            # --------------------------= Un-FLAG
            aHoughRefreshFLAG           = False
        # --------------------------------------------------------------------------------REFRESH-process-pipe-line ( with recent <state> <vars> )
        if ( aCannyRefreshFLAG ):

            edges   = cv2.Canny(        demo,   aCanny_LoTreshold,
                                                aCanny_HiTreshold
                                        )
            # --------------------------------------------------------------------------------GUI-SHOW-Canny()-<edges>-onRefreshFLAG
            cv2.imshow( "DEMO.Canny",   edges )
            pass

        if ( aCannyRefreshFLAG or aHoughRefreshFLAG ):

            circles = cv2.HoughCircles( edges,  cv2.cv.CV_HOUGH_GRADIENT,
                                                aHough_dp,
                                                aHough_minDistance,
                                                param1      = aHough_param1_aCannyHiTreshold,
                                                param2      = aHough_param2_aCentreDetectTreshold,
                                                minRadius   = aHough_minRadius,
                                                maxRadius   = aHough_maxRadius
                                        )
            # --------------------------------------------------------------------------------GUI-SHOW-HoughCircles()-<edges>-onRefreshFLAG
            demoWithCircles = cv2.cvtColor( demo,            cv2.COLOR_BGR2RGB )                          # .re-init <<< src
            demoWithCircles = cv2.cvtColor( demoWithCircles, cv2.COLOR_RGB2BGR )

            for aCircle in circles[0]:
                cv2.circle( demoWithCircles,    ( int( aCircle[0] ), int( aCircle[1] ) ),
                                                aCircle[2],
                                                (0,255,0),
                                                1
                            )
                pass
            pass
            cv2.imshow( "DEMO.Canny.Circles", demoWithCircles )
        pass        
        # --------------------------------------------------------------------------------<vars>-UPDATE-<state>
        # ref. above in .onRefreshFLAG RE-SYNC sections
        # --------------------------------------------------------------------------------GUI-INPUT ? [ESCAPE]
        aKeyPRESSED = cv2.waitKey(1) & 0xFF
    pass
    # --------------------------------------------------------------------------------GUI-<window>-s / DESTROY
    cv2.destroyWindow( "DEMO.IN" )
    cv2.destroyWindow( "DEMO.Canny" )
    cv2.destroyWindow( "DEMO.Canny.Circles" )
    # --------------------------------------------------------------------------------GUI-<window>-s
    pass

def main():
    GUI_openCV_circles()
    return 0

if __name__ == '__main__':
    main()

      

+1


source







All Articles