在opencv中的背景减法中过滤直线和曲线

埃坎什·古普塔(Ekansh Gupta)

我正在使用opencv中的背景减法进行对象跟踪。我已经拍摄了一个足球样本视频,我的目标是跟踪球员并过滤掉较大的场地标记。由于使用了非静态摄像头,因此大线也被检测为移动,如下图所示:检测到具有运动特征

我使用了霍夫变换来检测线条,并在设置了适当的阈值之后,能够过滤中途线条,并且图像显示如下: 过滤线

现在,我担心过滤这两个弧。

问题1.我可以通过哪些方式做到这一点?如何利用弧形(长和细)和播放器(紧凑的blob)在“属性”上的差异?

此外,霍夫变换功能有时会报告许多误报(将高个子瘦球员视为直线,甚至连2个球员都显示为更长的线)。

问题2.以什么方式指定“待检测”线的最大厚度并保持严格的标准来“仅”检测线?

谢谢。

瑞安

我有一个旧脚本可以实现类似功能。不幸的是,它是Python,并且没有使用霍夫变换函数。不过,您可能会发现它很有用。

get_blobs是重要的功能,同时__main__是示例用法。

import cv2

def get_blobs(thresh, maxblobs, maxmu03, iterations=1):
    """
    Return a 2-tuple list of the locations of large white blobs.
    `thresh` is a black and white threshold image.
    No more than `maxblobs` will be returned.
    Moments with a mu03 larger than `maxmu03` are ignored.
    Before sampling for blobs, the image will be eroded `iterations` times.
    """
    # Kernel specifies an erosion on direct pixel neighbours.
    kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
    # Remove noise and thin lines by eroding/dilating blobs.
    thresh = cv2.erode(thresh, kernel, iterations=iterations)
    thresh = cv2.dilate(thresh, kernel, iterations=iterations-1)

    # Calculate the centers of the contours.
    contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
    moments = map(cv2.moments, contours)

    # Filter out the moments that are too tall.
    moments = filter(lambda k: abs(k['mu03']) <= maxmu03, moments)
    # Select the largest moments.
    moments = sorted(moments, key=lambda k: k['m00'], reverse=True)[:maxblobs]
    # Return the centers of the moments.
    return [(m['m10'] / m['m00'], m['m01'] / m['m00']) for m in moments if m['m00'] != 0]

if __name__ == '__main__':
    # Load an image and mark the 14 largest blobs.
    image = cv2.imread('input.png')
    bwImage = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    trackers = get_blobs(bwImage, 14, 50000, 3)
    for tracker in trackers:
        cv2.circle(image, tuple(int(x) for x in tracker), 3, (0, 0, 255), -1)
    cv2.imwrite('output.png', image)

从第一张图片开始:

输入图像

该算法使用腐蚀来将斑点从线条中分离出来。

侵蚀

然后使用来过滤出高大的斑点和小斑点。力矩还用于定位每个斑点的中心。

输出图像

get_blobs返回玩家位置的2元组列表。您可以看到它们画在最后一张图像上。

就目前而言,该脚本确实很混乱。可以直接直接使用它,但我主要是为了向您提供一些想法而发布了它。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在opencv中的背景减法中过滤直线和曲线

来自分类Dev

需要控制“直线和曲线”的Spotfire.DXP中的对象或属性

来自分类Dev

直线和曲线之间的区域(无功能)

来自分类Dev

R中的曲线/直线拟合

来自分类Dev

表格中的背景减法

来自分类Dev

如何填充直线和曲线下的所有内容?

来自分类Dev

如何填充由直线和曲线创建的几何图形?

来自分类Dev

图片中的笔触检测算法以检测直线和曲线

来自分类Dev

python opencv背景减法

来自分类Dev

将直线拟合到matplotlib中的对数-对数曲线

来自分类Dev

从直线或曲线方程中采样x,y坐标

来自分类Dev

用Java中的OpenCV进行减法

来自分类Dev

将3D模型分解为直线和曲线

来自分类Dev

OpenCV3.1 背景减法

来自分类Dev

OpenCV中的同态过滤

来自分类Dev

OpenCV中的图像过滤

来自分类Dev

如何从背景减法中围绕对象绘制矩形

来自分类Dev

opencv=3.1.0 的背景减法器

来自分类Dev

在Quantmod图表的背景中添加垂直线

来自分类Dev

在d3力布局中,如何制作直线而不是曲线?

来自分类Dev

如何在曲线框html和css中添加垂直线分割和图例?

来自分类Dev

如何在一张图像中绘制曲线和直线?

来自分类Dev

在scilab中,您如何将sin绘制为曲线而不是直线?

来自分类Dev

OpenCV中2点之间的直线的斜率和长度

来自分类Dev

在python中使用OpenCV分隔图像中的直线和圆

来自分类Dev

OpenCV中2点之间的直线的斜率和长度

来自分类Dev

递归减法在numpy中

来自分类Dev

组装中的减法顺序

来自分类Dev

视频中的帧减法