2017-02-06 3 views
0
def detect_circles(): 
    img = cv2.imread('img.JPG', 0) 
    #img = cv2.medianBlur(img, 3) 
    #cim= cv2.GaussianBlur(img, (15, 15), 0) 
    cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 

    circles = cv2.HoughCircles(img, cv2.cv.CV_HOUGH_GRADIENT, 1, 30,param1=100,param2=39,minRadius=25,maxRadius=70) 
    circles = np.uint16(np.around(circles)) 
    count = 0 
    for i in circles[0, :]: 
     count = count + 1 
     # draw the outer circle 
     cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2) 
     # draw the center of the circle 
     cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3) 

    cv2.imwrite('circles_detected.JPG', cimg) 
    print(count) 

Diese Funktion wurde entwickelt, um Kreise in einem Bild zu erkennen. Es funktioniert gut, aber ich muss zwischen Farben unterscheiden. Also schrieb ich diese Funktion, die den G- und R-Wert jedes Pixelpython opencv - HoughCircles-Fehler nach Pixelmanipulation

def iterate_image(): 
    img = read_img('SDC10004.JPG') 
    height = img.shape[0] 
    width = img.shape[1] 
    for i in range(height): 
     for j in range(width): 
      #img.itemset((i,j, 0), 100) 
      img.itemset((i,j, 1), 0) 
      img.itemset((i,j, 2), 0) 

    write_img(img,'SDC10004_selfmade_blue.JPG') 

auf 0 setzt Wenn ich versuche ich diese Fehlermeldung mit dem blauen Pixelbild Kreise zu erkennen:

Traceback (most recent call last): 
File "/home/user/Documents/workspace/ImageProcessing/Main.py", line 107, in <module> 
detect_circles(); 
File "/home/user/Documents/workspace/ImageProcessing/Main.py", line 94, in detect_circles 
circles = np.uint16(np.around(circles)) 
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 2610, in around 
return _wrapit(a, 'round', decimals, out) 
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 43, in _wrapit 
result = getattr(asarray(obj), method)(*args, **kwds) 
AttributeError: rint 

Hat das schon mal jemand erlebt?

+0

Haben Sie versucht ** Kreise nach ** ** cv2.HoughCircles ** zu drucken, um zu sehen, was Sie bekommen? – NAmorim

+0

Ja. Bevor ich die Pixel manipulierte zeichnete ich die Kreise im Bild und es funktionierte – cmplx96

+0

Nach der Manipulation der Pixel bekomme ich die Fehlermeldung – cmplx96

Antwort

1

Also, ich glaube, ich habe herausgefunden, was das Problem hier ist.

HoughCircles ist nicht schwierig, man muss nur vorsichtig mit der Parametrierung sein. Diese Methode basiert auf dem Canny Kantendetektor, der wiederum Graustufenbilder schwächt.

The formula die opencv auf Graustufenbilder verwendet wird, gegeben durch:

RGB_to_Gray: 0.299.R + 0.587.G + 0.114.B 

Da Sie zwei der drei RGB-Kanäle sind Nullstellen, verringert sich die Intensität der Grauwerte. Dadurch vermeidet Ihr Schwellenwert eine Kreisdetektion und cv2.HoughCircles gibt zurück. Wenn Sie also nicht testen, ob Kreise vom Typ Keine ist, wird Ihr Skript nicht ausgeführt, wenn Sie versuchen, np.around (None) durchzuführen.

Einstellen param1 auf cv2.HoughCircles sollte es tun.

param1 – First method-specific parameter. In case of CV_HOUGH_GRADIENT , it is the higher threshold of the two passed to the Canny() edge detector (the lower one is twice smaller)

HoughCircles PARAM1 source.