python - 我如何通过 python 方式使用 opencv 在图像中找到篮球?

标签 python opencv image-processing numpy hough-transform

我一直致力于一个宠物项目,关于如何在图像中找到一个简单的篮球。在过去的几周里,我尝试了一系列使用 hough.circles 和 transform 等的排列,但我似乎无法通过代码示例和我自己的修补来接近隔离篮球。

这是一个示例照片: 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)

最佳答案

我同意其他发帖者的观点,即使用篮球的颜色是一种很好的方法。这是执行此操作的一些简单代码:

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. 篮球是场景中的主要橙色元素

根据这些假设,如果我们找到任何颜色正确的东西,我们就可以假设它是球并在其上画一个圆。这样我们根本不做任何圆圈检测。

如您在上图中所见,有一些较小的橙色元素(来自短裤)会扰乱我们的球半径估计。该代码使用操作(腐 eclipse 后跟膨胀)来移除这些。这非常适合您的示例图像。但对于其他图像,不同的方法可能更好:也使用圆检测,或轮廓形状、大小,或者如果我们正在处理视频,我们可以跟踪球的位置。

我在一个随机的篮球短视频上运行了这段代码(仅针对视频进行了修改),结果出奇地好(不是很好..但还可以)。

关于python - 我如何通过 python 方式使用 opencv 在图像中找到篮球?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870948/

相关文章:

python - 测量金属零件孔径的图片,远心拍摄,单色相机用opencv

python - 如何使用 Python 图像库将任何图像转换为 4 色调色板图像?

python - 使用 iPhone 加速度计数据获取图像的俯 View

python - 如何修改蒙版使其成为完美的圆形

python - TypeError: 'NoneType'对象无法下标opencv-python/python face_recognition

matlab - 图像中超像素的相邻和不相邻超像素

python - 如何找到列的 cumsum?

python - 合并不同范围的直方图

python - 在 python/tkinter 上将值从子窗口传递到父窗口

python - 平方 (x^2) 近似的神经网络