OpenCV Crop Hough Circles Python не работает - PullRequest
0 голосов
/ 26 июня 2018

Please Refer this Image for the post below Здравствуйте, я пытаюсь построить аналоговый считыватель с использованием OpenCV с Python.Я использовал Hough Circles, чтобы уменьшить кодирование.Код воспроизводится ниже:

import cv2
import numpy as np

img = cv2.imread('gauge.jpg', 0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

height,width = img.shape
mask = np.zeros((height,width), np.uint8)

counter = 0

circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,1,20,
                            param1=200,param2=100,minRadius=0,maxRadius=0)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # 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)

    # Draw on mask
    cv2.circle(mask,(i[0],i[1]),i[2],(255,255,255),-1)
    masked_data = cv2.bitwise_and(cimg, cimg, mask=mask)    

    # Apply Threshold
    _,thresh = cv2.threshold(mask,1,255,cv2.THRESH_BINARY)

    # Find Contour
    cnt = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]

    #print len(contours)
    x,y,w,h = cv2.boundingRect(cnt[0])

    # Crop masked_data
    crop = masked_data[y:y+h,x:x+w]

    # Write Files
    cv2.imwrite("output/crop"+str(counter)+".jpg", crop)

    counter +=1

print counter

cv2.imshow('detected circles',cimg)
cv2.imwrite("output/circled_img.jpg", cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

Мои вопросы, как показано ниже:

  1. Я не получаю отдельные наборы, но на каждом изображении у "crop0.jpg" есть 1, но«crop1.jpg» имеет 2, «crop3.jpg» имеет 4. То, что мне НУЖНО, - это отдельные круги в отдельных файлах, где я могу запустить пакетный алгоритм сопоставления.

  2. Итоговый результат равен5 в счетчике, который вы можете отметить.

1 Ответ

0 голосов
/ 26 июня 2018

Мне кажется, что вы делаете здесь сверхурочно.В этой строке

circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,1,20, param1=200,param2=100,minRadius=0,maxRadius=0)

вы фактически найдете искомые круги, но по какой-то причине вы пытаетесь найти их снова в следующем цикле.

Вы можете просто получить обрезанные изображенияиспользуя полученные координаты.Поскольку у каждого круга есть центр и радиус, вы можете получить ограничивающую рамку, в которую входит ваш круг, а затем (потенциально) наложить на него маску.
Что-то подобное сработает, я думаю:

for c in circles[0, :]:
    c = c.astype(int)
    # get the actual cropped images here
    crop = img_copy[c[1]-c[2]:c[1]+c[2], c[0]-c[2]:c[0]+c[2]]
    # create a mask and add each circle in it
    mask = np.zeros(crop.shape)
    mask = cv2.circle(mask, (c[2], c[2]), c[2], (255, 255, 255), -1)
    final_im = mask * crop

просто добавьте это перед тем, чтобы получить копию вашего изображения перед его фильтрацией:

img = cv2.imread('/home/gorfanidis/misc/gauge2.jpg', 0)
img_copy = img.copy()  # <- add this to have a copy of your original image

Редактировать:

, если по какой-либо причине вы не получаете результаты (тип возвращаемого значения None)или получите результаты с нулями (центр и радиус 0), тогда вы можете проверить для любого случая:

if circles is not None:  # checks that something actually was returned
    for c in circles[0, :]:
        c = c.astype(int)
        if not c[2]:  # just checks that radius is not zero to proceed
            continue
        ...
...