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

use*_*339 2 python opencv image-processing

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

在此输入图像描述

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

在此输入图像描述

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

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

在此输入图像描述

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

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

在此输入图像描述

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

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

cv2.drawContours(contourimage,bigbadlistofcontours[0],-1,(0,0,0),-1)
Run Code Online (Sandbox Code Playgroud)

哪里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))
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我尝试使用两种方法 - 一种使用drawContours,另一种使用fillPoly.两者都在blob轨道内产生不应该存在的小像素.知道什么可能导致这些像素存在吗?

Abi*_*n K 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)
Run Code Online (Sandbox Code Playgroud)

或者只是尝试以下方法:

for xx in bigbadlistofcontours:
    cv2.drawContours(contourimage,xx,-1,(0,0,0),-1)
Run Code Online (Sandbox Code Playgroud)

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

有关轮廓的更多详细信息