Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的轮廓没有在opencv中完全填充?_Python_Opencv_Image Processing - Fatal编程技术网

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

Python 为什么我的轮廓没有在opencv中完全填充?,python,opencv,image-processing,Python,Opencv,Image Processing,我正在处理这样的视频(这些是移动的斑点): 我能够成功地在opencv中进行基本处理,以查找斑点周围的轮廓,在斑点周围绘制圆圈等。下面是在原始视频帧的反转图像上绘制的一些跟踪信息: 我想对这些运动的水滴序列做一个投影,这样我就得到了一个带有黑色水滴运动轨迹的图像。我称之为一个斑点轨道。我认为我使用的术语“投影”是正确的,因为如果这是一个3d堆栈,它将被称为“z投影”(这次只有投影是通过视频中的时间/帧) 当我这样做时,我得到了一个接近我想要的斑点轨迹的图像,但是里面有微小的绿色像素,考虑到我

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

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

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

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

请注意blob轨迹内的绿色小像素。它们可能看起来很微妙,但我不希望它们出现在那里,也不明白为什么它们会出现在那里,因为我在代码中所做的一切就是在一个黑色的斑点上打上印记。它们是绿色的这一事实对我来说意味着它们是我绘制水滴轨迹的绿色背景图像的一部分

我知道我的填充是有效的,因为如果我用一个帧代替一个斑点轨迹,我会得到这个,看起来很好:

我做投影的方式一定出了问题(随时间增加填充轮廓)

单个框架(工作和上图所示)的代码为:

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

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


正如你所看到的,我尝试了两种方法——一种是使用drawContours,另一种是使用fillPoly。两者都会在水滴轨迹内产生不应该存在的小像素。知道是什么导致这些像素出现吗

对您的代码做一个小的修改,然后尝试以下代码:

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数组中绘制一个点,而不是完整的轮廓

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)