2017-02-06 12 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) 

Эта функция предназначена для обнаружения кругов на изображении. Работает хорошо, но мне нужно различать цвета. Поэтому я написал эту функцию, которая устанавливает G и R значение каждого пикселя на 0.python opencv - ошибка HoughCircles после обработки пикселей

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') 

Когда я пытаюсь обнаружить круги с синим пикселя изображения я получаю сообщение об ошибке:

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 

Кто-нибудь раньше это усиливал?

+0

Пробовал ли вы ** печатать круги ** после вас ** cv2.HoughCircles **, чтобы узнать, что вы получаете? – NAmorim

+0

Да. Прежде чем я манипулировал пикселями, я нарисовал круги на изображении, и он сработал – cmplx96

+0

После манипулирования пикселями я получаю сообщение об ошибке – cmplx96

ответ

1

Итак, я считаю, что выяснил, в чем проблема.

HoughCircles не сложно, вам просто нужно быть осторожным с его параметризацией. Этот метод основан на детекторе Canny edge, который, в свою очередь, порождает полутоновые изображения.

The formula, который OpenCV использует для изображений в оттенках серого определяется по формуле:

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

Поскольку вы обнуления два из трех RGB каналов, интенсивность полутоновых значений будет уменьшаться. В результате ваш порог позволяет избежать любого обнаружения круга и cv2.HoughCircles возвращает Отсутствует. Следовательно, поскольку вы не тестируете, если круги имеет тип Нет, ваш скрипт не будет работать, когда вы попытаетесь выполнить np.around (None).

Регулировка param1 на cv2.HoughCircles должен сделать трюк.

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.