2014-04-04 4 views
6

저는 이미지에서 간단한 농구를 찾는 방법에 대해 조금은 애완 동물 프로젝트에 노력하고 있습니다. 지난 몇 주 동안 hough.circles와 변형 등을 사용하여 수많은 순열을 시도했지만 코드 예제와 내 자신 만의 농담으로 농구를 분리하는 데는 거의 가깝지 않습니다. 여기 어떻게 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)을 사용하여이를 제거합니다. 이는 예제 이미지에 적합합니다. 그러나 다른 이미지의 경우에는 원 감지 또는 윤곽선 모양, 크기를 사용하거나 비디오를 처리하는 경우 공 위치를 추적 할 수있는 다른 방법이 좋습니다.

랜덤 짧은 농구 비디오에서이 코드 (비디오 용으로 만 수정 됨)를 실행했는데 놀랍게도 ok (훌륭하지는 않지만 ok)로 작동했습니다.

+0

코딩을하기 전에 문제를 해결할 수있는 훌륭한 기본 방법 인이 문제를 해결하고 논리적으로 설명 할 수있는 몇 가지 코드를 공유하고 공유하면서 시간을내어 주셔서 감사합니다. –

1

몇 가지 생각 : 먼저 이미지를 단순화하기 위해 색상별로

  1. 필터

    는 여기에 내가 손보는하고있는 코드입니다. 오렌지 농구를 특별히 구하는 경우 다른 색을 많이 없앨 수 있습니다. RGB 대신 HSI 색상 공간을 사용하는 것이 좋지만, 어쨌든 숙련 된 농구 색상과 3 차원 색상의 거리가있는 색상은 제외 할 수 있어야합니다.

  2. 수동 매개 변수에 의존하지 않는 Sobel 또는 다른 커널 기반 가장자리 감지기를 사용해보십시오. 가장자리 이미지를 표시하여 "옳은 것"으로 보이는지 확인하십시오.
  3. 약한 가장자리를 허용합니다. 그레이 스케일 이미지에서 농구와 플레이어의 어두운 저지 사이의 대비는 흰색 언더 셔츠와 검정 저지의 차이만큼 크지 않습니다.
  4. 개체가 단면적으로 명목상으로 만 원형이지만 실제로 이미지가 길어 지거나 실제 이미지에 노이즈가있을 때 Hough가 예기치 않은 결과를 가져올 수 있습니다. 나는 보통 자신의 Hough 알고리즘을 작성하고 OpenCV 구현에 영향을 미치지 않았으므로 어떤 매개 변수를 변경해야할지 모르겠다. 그러나 fuzzier edge를 허용 할 수 있는지 확인한다.
  5. 부드럽게 작동하지 않을 수 있습니다. 어쨌든 가장자리를 찾기 전에 부드럽게 해보십시오.
  6. 거친 Hough 알고리즘을 작성하십시오. 빠른 구현은 OpenCV 구현만큼 유연하지 않을 수도 있지만 손을 더러워지면 문제의 원인을 찾아 낼 수 있습니다.