检测网球场线截距

克里斯托弗·海伍德

我正在尝试改进代码以查找网球场线截距,以便可以找到法院不同象限的边界。

输入图像 这是我要分析的网球场图像

输出图像 这是最终结果

通过首先找到图像中的白色像素,然后通过一些预处理(例如高斯模糊)应用Canny边缘检测,从而实现了这一目标。然后,将Canny边缘输出扩大,以帮助准备好进行Hough线检测。

然后,获取高音线输出,我使用了github用户ideamanman42Bentley- Ottmann算法的python实现来找到高音线截距。

这似乎工作得很好,但是我正在努力调整系统以找到最后4个拦截点。如果有人可以给我建议以改善或调整此实现方式,甚至提出一些想法来寻求解决法院界限问题的更好方法,我将不胜感激。

# import the necessary packages
import numpy as np
import argparse
import cv2
import scipy.ndimage as ndi
import  poly_point_isect as bot

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help = "path to the image")
args = vars(ap.parse_args())

# load the image
image = cv2.imread(args["image"])

# define the list of boundaries
boundaries = [
    ([180, 180, 100], [255, 255, 255])
]

# loop over the boundaries
for (lower, upper) in boundaries:
    # create NumPy arrays from the boundaries
    lower = np.array(lower, dtype = "uint8")
    upper = np.array(upper, dtype = "uint8")

    # find the colors within the specified boundaries and apply
    # the mask
    mask = cv2.inRange(image, lower, upper)
    output = cv2.bitwise_and(image, image, mask = mask)

    # show the images
    cv2.imshow("images", np.hstack([image, output]))
    cv2.waitKey(0)

gray = cv2.cvtColor(output,cv2.COLOR_BGR2GRAY)

kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size),0)

low_threshold = 10
high_threshold = 200
edges = cv2.Canny(gray, low_threshold, high_threshold)
dilated = cv2.dilate(edges, np.ones((2,2), dtype=np.uint8))

cv2.imshow('dilated.png', dilated)
cv2.waitKey(0)

rho = 1  # distance resolution in pixels of the Hough grid
theta = np.pi / 180  # angular resolution in radians of the Hough grid
threshold = 10 # minimum number of votes (intersections in Hough grid cell)
min_line_length = 40  # minimum number of pixels making up a line
max_line_gap = 5  # maximum gap in pixels between connectable line segments
line_image = np.copy(output) * 0  # creating a blank to draw lines on

# Run Hough on edge detected image
# Output "lines" is an array containing endpoints of detected line segments

lines = cv2.HoughLinesP(dilated, rho, theta, threshold, np.array([]), min_line_length, max_line_gap)

points = []
for line in lines:
    for x1, y1, x2, y2 in line:
        points.append(((x1 + 0.0, y1 + 0.0), (x2 + 0.0, y2 + 0.0)))
        cv2.line(line_image, (x1, y1), (x2, y2), (255, 0, 0), 5)        

cv2.imshow('houghlines.png', line_image)
cv2.waitKey(0)

lines_edges = cv2.addWeighted(output, 0.8, line_image, 1, 0)
print(lines_edges.shape)

intersections = bot.isect_segments(points)
print(intersections)

for idx, inter in enumerate(intersections):
    a, b = inter
    match = 0
    for other_inter in intersections[idx:]:
        c, d = other_inter
        if abs(c-a) < 8 and abs(d-b) < 8:
            match = 1
            if other_inter in intersections:
                intersections.remove(other_inter)
                intersections[idx] = ((c+a)/2, (d+b)/2)

    if match == 0:
        intersections.remove(inter)

for inter in intersections:
    a, b = inter
    for i in range(6):
        for j in range(6):
            lines_edges[int(b) + i, int(a) + j] = [0, 0, 255]

# Show the result
cv2.imshow('line_intersections.png', lines_edges)
cv2.imwrite('line_intersections.png', lines_edges)
cv2.waitKey(0)
安德烈亚斯

这是我使用不同方法的解决方案。我使用哈里斯拐角检测器来检测拐角。这些参数只是急忙调整的,因此随时可以使用它们。是来自OpenCV的教程。

我使用OpenCV包装器库获取一些更简单的OpenCV代码。如果您不想翻译,它应该很容易翻译。

# import the necessary packages
import numpy as np
import cv2
import opencv_wrapper as cvw

# import  poly_point_isect as bot

# construct the argument parse and parse the arguments
# load the image
image = cv2.imread("tennis.jpg")

# define the list of boundaries
boundaries = [([180, 180, 100], [255, 255, 255])]

# loop over the boundaries
for (lower, upper) in boundaries:
    # create NumPy arrays from the boundaries
    lower = np.array(lower, dtype="uint8")
    upper = np.array(upper, dtype="uint8")

    # find the colors within the specified boundaries and apply
    # the mask
    mask = cv2.inRange(image, lower, upper)
    output = cv2.bitwise_and(image, image, mask=mask)

# Start my code
gray = cvw.bgr2gray(output)

corners = cv2.cornerHarris(gray, 9, 3, 0.01)
corners = cvw.normalize(corners).astype(np.uint8)

thresh = cvw.threshold_otsu(corners)
dilated = cvw.dilate(thresh, 3)

contours = cvw.find_external_contours(dilated)

for contour in contours:
    cvw.circle(image, contour.center, 3, cvw.Color.RED, -1)

cv2.imshow("Image", image)
cv2.waitKey(0)

结果:

enter image description here

披露:我是OpenCV Wrapper的作者。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将图像转换为二进制不会显示足球场的白线

来自分类Dev

R ggplot中心的垂直和水平线截距

来自分类Dev

指定回归线截距(R&ggplot2)

来自分类Dev

检测变形线

来自分类Dev

绘制图的切线并使用R查找X截距

来自分类Dev

给定y截距和斜率在图表中绘制一条线

来自分类Dev

在ggvis中用截距和斜率画一条线

来自分类Dev

如何获得每个组/模型的系数/截距,以便绘制每个组的拟合线?

来自分类Dev

绘制一组不同角度的平行线以求出平均截距

来自分类Dev

网球记分员

来自分类Dev

在MATLAB中检测不规则线/折线

来自分类Dev

绘制cv :: HoughLines检测到的线

来自分类Dev

在beginShape / vertex中检测相交线的方法?

来自分类Dev

Pygame。高效检测精灵与线碰撞

来自分类Dev

最长的线检测-Python-OpenCV

来自分类Dev

检测图像中的水平线

来自分类Dev

在Matlab中检测不规则线/折线

来自分类Dev

特定方向上的线检测python

来自分类Dev

为什么sklearn线性回归会为穿过(0,0)的线给出非零截距?

来自分类Dev

检测与sed模式匹配的两条连续线

来自分类Dev

Python cv2 HoughLines网格线检测

来自分类Dev

如何检测位图中的线/曲线?( C# )

来自分类Dev

检测扫描文档中裁切线的位置

来自分类Dev

OpenCV检测脸部界标(耳-下巴-耳线)

来自分类Dev

使用OpenCV在Android中进行Hough线检测

来自分类Dev

使用openCV检测线的孔,末端和起点?

来自分类Dev

OpenCV中最基本的线检测方法是什么

来自分类Dev

如何检测天气线在Android中与路径相交

来自分类Dev

如何检测位图中的线/曲线?( C# )