为什么我的轮廓没有被opencv完全填满?

时间:2014-02-24 01:04:44

标签: python opencv image-processing

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

enter image description here

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

enter image description here

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

当我这样做的时候,我得到了一个接近我想要的斑点轨迹的图像,但是里面有一些微小的绿色像素,我不希望它在那里,因为我用黑色填充轮廓然后合并这些填充的轮廓。我得到这样的东西:

enter image description here

请注意blob轨道内存在的绿色小像素。它们可能看起来很微妙,但我不想要它们在那里,并且无法弄清楚它们为什么在那里,因为我在代码中所做的就是在另一个上面加盖黑色斑点。它们是绿色的这一事实向我暗示它们是我绘制斑点轨道的绿色背景图像的一部分。

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

enter image description here

我正在进行投影的方式(通过时间添加填充轮廓)必定会出现问题。

单帧的代码(工作并在上面显示)是:

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

其中contourimage是一个绿色图像,我的框架大小,bigbadlistofcontours [0]是我的轮廓列表中的第一个条目,你可以看到bigbadlistofcontours [0]包含两个轮廓,代表两个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轨道内产生不应该存在的小像素。知道什么可能导致这些像素存在吗?

1 个答案:

答案 0 :(得分:5)

对您的代码进行小幅修正,然后尝试以下代码:

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