首页 文章

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

提问于
浏览
2

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

enter image description here

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

enter image description here

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

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

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 回答

  • 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

相关问题