如何使用 python 和 openCV 只检测该图像中的白色边框

Per*_*784 0 python opencv image-processing

网球场

如何使用 opencv python 从上图中单独检测白线?我可以使用哪种方法?或者是否有任何内置功能可用于此目的?

霍夫在这个案子上的表现并不好。最终的输出应该是这样的: 车道 在此输入图像描述

a.s*_*iet 5

看来霍夫确实做得很好。我采用此处显示的示例,仅对边缘提取进行了一些小的修改:

加载图像并转换为灰度:

import numpy as np
import cv2
import scipy.ndimage as ndi

img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Run Code Online (Sandbox Code Playgroud)

然后我应用了中值滤波器来消除一些高频边缘/噪声,例如图像中的网络:

smooth = ndi.filters.median_filter(gray, size=2)
Run Code Online (Sandbox Code Playgroud)

结果如下: 在此输入图像描述

然后我应用了一个简单的阈值来提取白线。或者,您可以应用拉普拉斯滤波器来提取边缘,但是,简单的阈值处理将忽略例如网球场后面的水平线:

edges = smooth > 180
Run Code Online (Sandbox Code Playgroud)

结果: 在此输入图像描述

然后执行与本例类似的霍夫线变换。

lines = cv2.HoughLines(edges.astype(np.uint8), 0.5, np.pi/180, 120)

for rho,theta in lines[0]:
    print(rho, theta)
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)

# Show the result
cv2.imshow("Line Detection", img)
Run Code Online (Sandbox Code Playgroud)

您可以调整精度并修改结果。我最终选择了参数0.5120。总体结果:

在此输入图像描述