2017-02-13 278 views
8

我在檢測圓圈區域時遇到問題。 我用opencv的HoughCircles函數試了一下。然而,儘管圖像非常相似,但功能的參數必須不同才能檢測到圓圈。python opencv - blob檢測或圓圈檢測

我嘗試的另一種方法是迭代每個像素,並檢查當前像素是否是白色。 如果是這種情況,那麼檢查該區域是否有斑點物體(斑點中心距離小於閾值)。如果有,則將像素追加到blob,如果沒有,則創建一個新的blob。 這也沒有正常工作。

有沒有人有一個想法,我可以如何使這項工作(90%的檢測)? 我附上了一個示例圖像和另一個圖像,我標記了圓圈。 謝謝!

example

example with arrows

UPDATE: 謝謝你的幫助迄今爲止! 這是我獲得的輪廓和麪積過濾它們的代碼:

im = cv2.imread('extract_blue.jpg') 
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 
im_gauss = cv2.GaussianBlur(imgray, (5, 5), 0) 
ret, thresh = cv2.threshold(im_gauss, 127, 255, 0) 
# get contours 
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 

contours_area = [] 
# calculate area and filter into new array 
for con in contours: 
    area = cv2.contourArea(con) 
    if 1000 < area < 10000: 
     contours_area.append(con) 

這工作非常整潔。我畫了他們的形象: contours_filtered_area

這是我通過圓過濾部分,它直接在下面,我通過區域過濾代碼:

contours_cirles = [] 

# check if contour is of circular shape 
for con in contours_area: 
    perimeter = cv2.arcLength(con, True) 
    area = cv2.contourArea(con) 
    if perimeter == 0: 
     break 
    circularity = 4*math.pi*(area/perimeter*perimeter) 
    print circularity 
    if 0.8 < circularity < 1.2: 
     contours_cirles.append(con) 

然而,新的名單「contours_cirles」是空的。我在環印有「圓」和值10之間的所有000和100 000

更新#2: 糾正現在運轉缺少括號後!

contours_cirles = [] 

# check if contour is of circular shape 
for con in contours_area: 
    perimeter = cv2.arcLength(con, True) 
    area = cv2.contourArea(con) 
    if perimeter == 0: 
     break 
    circularity = 4*math.pi*(area/(perimeter*perimeter)) 
    print circularity 
    if 0.7 < circularity < 1.2: 
     contours_cirles.append(con) 

非常感謝你們! :)

example_done

+0

非常老的代碼。但你可以檢查這個。 https://github.com/bipul21/Colored-Ball-Tracking –

+0

'(面積/周長*周長)'這對我來說看起來很奇怪。你確定,你沒有忘記任何括號? – Moritz

+0

是的,你是對的。 圓形度= 4 * math.pi *(面積/(周長*周長)) – cmplx96

回答

4

作爲一個起點,你可能會開始:

    • 使用cv2.findContours()
    • 遍歷每個輪廓找出給定圖像中的所有輪廓
    • 計算面積,如果輪廓的面積在給定範圍內,比如70 < area < 150。這將濾出一些非常小的和大的輪廓。
    • 使用面積閾值過濾輪廓後,需要檢查輪廓邊緣的數量,可以使用以下方法: cv2.approxPolyDP(),對於圓圈長度(大約)必須> 8,但是可以是< 23。 應用一些更復雜的操作來檢測這裏的圓圈。

你應該嘗試實施這種做法,更新,你將從此編寫代碼的問題。

編輯: 如@Miki建議的,有一種檢測更好,更潔淨的方式,如果幾何形狀使用圓= 4PI(面積/周長^ 2)是圓形形狀的,並且決定的閾值如0.9,以檢查形狀是否爲圓形。爲完美圓circularity == 1。你可以根據你的需要微調這個門檻。

您可以參考arcLength來查找輪廓的周長,並使用contourArea來獲得計算圓度所需的輪廓面積。

+4

我會用_circularity_來衡量一個形狀是一個圓的大小:「圓形度定義爲:A衡量形狀是多麼接近圓形,例如一個正六邊形比圓形有更高的圓形度,被定義爲(\ frac {4 * \ pi * Area} {perimeter * perimeter})。這意味着圓的圓度爲1,圓的正方形爲0.785,依此類推。 – Miki

+1

非常感謝@Miki – ZdaR

1

我們可以嘗試Hough Transformation太檢測圈的圖像,並與閾值發揮得到期望的結果(檢測圈在綠色邊界線用紅色圓點爲中心):

import cv2 
import numpy as np 

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

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,10, 
          param1=50,param2=12,minRadius=0,maxRadius=20) 

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) 

cv2.imshow('detected circles',cimg) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

enter image description here