2014-04-04 24 views
6

我一直在做一個關於如何在圖像中找到一個簡單籃球的寵物項目。在過去的幾周裏,我嘗試了一系列使用hough.circles和transform等的組合,但我似乎無法接近使用代碼示例和我自己的修補程序隔離籃球的任何地方。我如何pythonically我們opencv在圖像中找到一個籃球?

下面是一個例子照片: boy with a basketball 這裏是圓的簡單版本發現代碼我一直襬弄之後的結果: houghcircle transform circle finding

任何人有任何想法,我出了問題,以及如何我可以正確嗎?

這裏是我亂搞代碼:

import cv2 
import cv2.cv as cv # here 
import numpy as np 

def draw_circles(storage, output): 
    circles = np.asarray(storage) 
    for circle in circles: 
     Radius, x, y = int(circle[0][3]), int(circle[0][0]), int(circle[0][4]) 
     cv.Circle(output, (x, y), 1, cv.CV_RGB(0, 255, 0), -1, 8, 0) 
     cv.Circle(output, (x, y), Radius, cv.CV_RGB(255, 0, 0), 3, 8, 0) 

orig = cv.LoadImage('basket.jpg') 
processed = cv.LoadImage('basket.jpg',cv.CV_LOAD_IMAGE_GRAYSCALE) 
storage = cv.CreateMat(orig.width, 1, cv.CV_32FC3) 
#use canny, as HoughCircles seems to prefer ring like circles to filled ones. 
cv.Canny(processed, processed, 5, 70, 3) 
#smooth to reduce noise a bit more 
cv.Smooth(processed, processed, cv.CV_GAUSSIAN, 7, 7) 

cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 32.0, 30, 550) 
draw_circles(storage, orig) 

cv.imwrite('found_basketball.jpg',orig) 
+1

而不是加載文件作爲灰度圖像,如何加載它作爲彩色圖像,並進行一些預處理,以強調橙色的球之前扁平化的圖像和傳遞給Canny濾波器? –

回答

3

我同意其他海報,使用籃球的顏色是一種很好的方法。下面是一些簡單的代碼,做的是:

import cv2 
import numpy as np 

im = cv2.imread('../media/basketball.jpg') 

# convert to HSV space 
im_hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 
# take only the orange, highly saturated, and bright parts 
im_hsv = cv2.inRange(im_hsv, (7,180,180), (11,255,255)) 

# To show the detected orange parts: 
im_orange = im.copy() 
im_orange[im_hsv==0] = 0 
# cv2.imshow('im_orange',im_orange) 

# Perform opening to remove smaller elements 
element = np.ones((5,5)).astype(np.uint8) 
im_hsv = cv2.erode(im_hsv, element) 
im_hsv = cv2.dilate(im_hsv, element) 

points = np.dstack(np.where(im_hsv>0)).astype(np.float32) 
# fit a bounding circle to the orange points 
center, radius = cv2.minEnclosingCircle(points) 
# draw this circle 
cv2.circle(im, (int(center[1]), int(center[0])), int(radius), (255,0,0), thickness=3) 

out = np.vstack([im_orange,im]) 
cv2.imwrite('out.png',out) 

結果:

enter image description here

我認爲:

  1. 始終有且僅有一個籃球存在
  2. 籃球是現場主要的橙色物品

有了這些假設,如果我們發現任何正確的顏色,我們可以假設它的球並適合它的一個圓圈。這樣我們根本不做任何圓檢測。從上圖中可以看到,有些較小的橙色元素(來自短褲)可能會弄亂我們的球半徑估算。該代碼使用opening操作(erosion後跟dilation)來刪除這些操作。這適用於您的示例圖像。但對於其他圖像,不同的方法可能會更好:使用圓檢測或輪廓形狀,大小,或者如果我們正在處理視頻,我們可以跟蹤球的位置。

我在一個隨機的短籃球視頻中運行這個代碼(只對視頻進行了修改),它的工作令人驚訝的確定(不是很好,但可以)。

+0

感謝您花時間玩這個遊戲,並分享一些代碼來試驗和解釋解決它的邏輯,這是在編碼之前解決問題的一個好方法。 –

1

的一點想法:

  1. 通過彩色濾光片第一簡化圖像。如果你專門尋找橙色籃球,你可以消除許多其他顏色。我建議使用HSI色彩空間而不是RGB,但在任何情況下,您都應該能夠從訓練有素的籃球顏色中排除顏色三維空間中某些距離的顏色。
  2. 嘗試替換Sobel或其他不依賴於手動參數的基於內核的邊緣檢測器。顯示邊緣圖像以查看它是否看起來「正確」給你。
  3. 允許較弱的邊緣。在灰度圖像中,籃球和球員的黑色球衣之間的對比度不如白色汗衫和黑色球衣之間的差異。
  4. 如果物體的橫截面只是名義上的圓形,但實際上是細長的或在實際圖像中有嘈雜的邊緣,則可能會產生意想不到的結果。我通常編寫我自己的Hough算法,並沒有觸及OpenCV實現,所以我不確定要更改哪個參數,但看看您是否允許更模糊的邊緣。
  5. 也許會消除平穩操作。無論如何,在找到邊緣之前嘗試平滑,而不是反其道而行。
  6. 試着寫你自己的粗糙Hough算法。雖然快速實現可能不像OpenCV實現那樣靈活,但通過讓手變髒,您可能會偶然發現問題的根源。
相關問題