【问题标题】:why are my contours not being totally filled in opencv?为什么我的轮廓没有完全被opencv填充?
【发布时间】:2014-02-24 01:04:43
【问题描述】:

我正在处理看起来像这样的视频(这些是移动的 blob):

我能够在 opencv 中成功地进行基本处理,以查找斑点周围的轮廓、围绕它们绘制圆圈等。下面是在原始视频帧的倒置图像上绘制的一些跟踪信息:

我想对这些移动的斑点序列进行投影,这样我就可以得到一个带有黑色斑点运动轨迹的图像。我称之为blob轨道。我想我正确地使用了术语“投影”,因为如果这是一个 3d 堆栈,它将被称为“z 投影”(这次只有投影是通过视频中的时间/帧进行的)。

当我这样做时,我得到了一个接近我想要的 blob 轨道的图像,但考虑到我用黑色填充轮廓然后合并,我不希望在里面有微小的绿色像素这些填充的轮廓。我得到这样的东西:

注意斑点轨道内的绿色小像素。它们可能看起来很微妙,但我不希望它们在那里,并且考虑到我在代码中所做的只是将黑色斑点压在另一个上面,我不知道它们为什么在那里。它们是绿色的这一事实对我来说意味着它们是我在其上绘制斑点轨迹的绿色背景图像的一部分。

我知道我的填充是有效的,因为如果我采用单帧而不是制作 blob-track 我会得到这个,这看起来不错:

我进行投影的方式一定有问题(随着时间的推移添加填充的轮廓)。

单帧的代码(如上所示)是:

cv2.drawContours(contourimage,bigbadlistofcontours[0],-1,(0,0,0),-1)

contourimage 是一个与我的框架大小相同的绿色图像,bigbadlistofcontours[0] 是我的轮廓列表中的第一个条目,正如您所见,bigbadlistofcontours[0] 包含 两个轮廓 em>,代表两个blob,上面绘制成功。

添加/投影多个帧的代码(不起作用并且内部有这些绿色小像素)是:

for xx in bigbadlistofcontours:
    cv2.drawContours(contourimage,xx[0],-1,(0,0,0),-1)
    cv2.drawContours(contourimage,xx[1],-1,(0,0,0),-1)
    #cv2.fillPoly(contourimage, pts =xx[0], color=(0,0,0))
    #cv2.fillPoly(contourimage, pts =xx[1], color=(0,0,0))

如您所见,我尝试使用两种方法 - 一种使用 drawContours,另一种使用 fillPoly。两者都会在 blob 轨道内产生不应该存在的小像素。知道什么会导致这些像素在那里吗?

【问题讨论】:

    标签: python opencv image-processing


    【解决方案1】:

    对你的代码做一个小修正,然后试试下面的代码:

    for xx in bigbadlistofcontours:
        cv2.drawContours(contourimage,[xx[0]],-1,(0,0,0),-1)
        cv2.drawContours(contourimage,[xx[1]],-1,(0,0,0),-1)
    

    或者干脆尝试以下方法:

    for xx in bigbadlistofcontours:
        cv2.drawContours(contourimage,xx,-1,(0,0,0),-1)
    

    findContours 需要一个轮廓列表作为参数,即一个 numpy 数组列表。当您通过bigbadlistofcontours[0] 时,它是两个numpy 数组的列表,即两个轮廓。但是当你第二次传递xx 时,你传递了xx[0] 这是一个numpy 数组和xx[1] 这是另一个numpy 数组。在这种情况下,它只会在该 numpy 数组中绘制一个点,而不是完整的轮廓。

    More Details on Contours

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-13
      • 2014-11-26
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 2013-11-17
      相关资源
      最近更新 更多