Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/OpenCV-使用OpenCV中Hough线的两种不同方法检测网球场中的线-获得不同的结果_Python_Opencv_Transformation - Fatal编程技术网

Python/OpenCV-使用OpenCV中Hough线的两种不同方法检测网球场中的线-获得不同的结果

Python/OpenCV-使用OpenCV中Hough线的两种不同方法检测网球场中的线-获得不同的结果,python,opencv,transformation,Python,Opencv,Transformation,我正在尝试使用openCV和hough变换检测网球场中的线条。我想找到水平线和垂直线,以便找到交点,并最终检测出网球场的拐角 这里是原始图像。 但是我有一些问题 1) 我试着用HoughLineP。 代码如下: gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray,100,200,apertureSize = 3) lines = cv2.HoughLinesP(edges, 1, np.pi/2, 6, None,

我正在尝试使用openCV和hough变换检测网球场中的线条。我想找到水平线和垂直线,以便找到交点,并最终检测出网球场的拐角

这里是原始图像。

但是我有一些问题

1) 我试着用HoughLineP。 代码如下:

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

edges = cv2.Canny(gray,100,200,apertureSize = 3)
lines = cv2.HoughLinesP(edges, 1, np.pi/2, 6, None, 50, 10);
for line in lines[0]:
    pt1 = (line[0],line[1])
    pt2 = (line[2],line[3])
    cv2.line(img, pt1, pt2, (0,0,255), 2)
cv2.imshow('dst',img)

return res
结果如下:

2) 我试着用HoughLines 这是密码

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

edges = cv2.Canny(gray,100,200,apertureSize = 3)


#Lignes
lines = cv2.HoughLines(edges,1,np.pi/70,110)
for rho,theta in lines[0]:
    if (np.pi/70 <= theta <= np.pi/7) or (2.056 < theta < 4.970) or (1.570 <= theta <= 1.600): #(2,6 <=theta <= 26) or (theta >118 and theta <= 285)

        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(res,(x1,y1),(x2,y2),(0,0,255),1)
gray=cv2.cvt颜色(res,cv2.COLOR\u bgr2灰色)
边缘=cv2.坎尼(灰色,100200,孔径尺寸=3)
#对齐
线=cv2.霍夫线(边,1,np.pi/70110)
对于ρ,θ在[0]行中:

如果(np.pi/70查找行,HougLines输出包含您想要的行。您只需要过滤掉异常值

为此,您可以使用您的网球场模型。您所知道的是:

  • 字段的外部限制,由一个大矩形表示
  • 两条走廊,由两条线表示,这两条线在两侧切割矩形
  • 服务方格,再次由两条线表示,一条平行于服务线,另一条平行于侧面
例如,你可以尝试从模型中获取利润,你必须过滤掉异常值。有些方法,比如,就是这样做的。基本思想是取随机点,计算模型,并检查数据是否合适。经过一些迭代后,最适合的可能是你寻找的模型。这是一种非常有名的方法(Fisher 1986第一次出版)所以你可以在它上面找到大量的文档。让我们用一个简单的示例算法来为你工作(可能有适应性):

  • 在直线交点内取4个随机点。计算将这些点映射到场地俯视图的透视投影p。您可以使用OpenCV的getPerspectiveTransform进行此操作。现在,在俯视图中有了场地模型

  • 因为你有一个场地模型(基于网球规则),你可以说其他线的交点(服务线与走廊线、服务广场..)应该在顶视图上的什么位置。如果你对这些点应用透视变换p^{-1}的逆,你就可以在图像空间中找到它们

  • 检查一致性:在图像空间中查找与模型最接近的线交点。这里您应该有一个度量:距离小于x像素的线交点数,或SSD。您将使用此度量对不同的模型进行评级

  • 为您的模型评分:如果您定义的指标小于以前找到的最佳指标,则这就是您当前的最佳模型

  • 迭代。你所做的迭代次数直接关系到最终选择一个好模型的概率。查看Fischler和Bolls的开创性工作,了解如何设置迭代次数

  • 在这里,在迭代结束时,您将找到最适合您的数据的模型,即描述网球场的内联线和不描述网球场的异常值。请注意,此方法对大量异常值(超过50%)具有鲁棒性,但获得良好结果的机会仅限于统计(不过,您可以通过调整迭代次数来设置结果的预期质量)

    希望这有帮助


    Ben

    为什么不将交叉点合并为组,并将组的平均值视为该组的点代表?那么你将有更少的点要处理我想这样做,但不起作用。也许我做得不好。你能在拐角处的交叉点上尝试dbscan聚类吗?我想应该可以,我不知道t、 有方法吗?dbscan是一种聚类方法().sklearn有一个实现。你将交点传递给算法,然后你应该返回簇。当然,你仍然需要区分哪些簇构成了实际网球场的一角。你可以彻底检查所有点对,看看它们是否有任何一个看起来像网球场。因为这些点减少了很多通过集群,您应该没有问题。谢谢Ben的回答!我会看看这个方法,但对我来说实现它似乎有点困难。