为什么我的轮廓没有完全填充在opencv中?

2024-04-19 03:45:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理这样的视频(这些是移动的水滴):

enter image description here

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

enter image description here

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

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

enter image description here

注意blob轨迹中的绿色小像素。它们可能看起来很微妙,但我不想让它们出现,也不知道它们为什么会在那里,因为我在代码中所做的就是在一个又一个上面印上黑色的斑点。事实上它们是绿色的,这意味着它们是我在上面绘制斑点轨迹的绿色背景图像的一部分。在

我知道我的填充是有效的,因为如果我采取一个单一的帧,而不是一个斑点轨道,我得到这个,这看起来很好:

enter image description here

我做投影的方式一定出了问题(通过时间添加填充轮廓)。在

单个框架的代码(工作和上面显示的)是:

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

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

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

^{pr2}$

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


Tags: 代码图像视频轨迹绘制像素blob轮廓
1条回答
网友
1楼 · 发布于 2024-04-19 03:45:01

对您的代码进行一个小的更正,然后尝试以下代码:

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

或者只需尝试以下操作:

^{pr2}$

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

More Details on Contours

相关问题 更多 >