问题标签 [opencv-contour]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
114 浏览

opencv - 尽管逻辑正确,但我的小于某个值的轮廓并未从轮廓列表中删除。为什么?

我从这张图片开始:

在此处输入图像描述

然后我应用了 Canny 边缘检测器,例如:

我有:

在此处输入图像描述

然后我找到了一个轮廓列表(contoursImgproc.findContours()。然后我做了一些编码来(1)找到最大轮廓的区域(maximumContourArea)(2)从contours任何面积小于的轮廓中删除maximumContourArea。问题底部给出的代码。

我调用通过在原始图像上Imgproc.drawContours()绘制绿色(剩余)轮廓

我所期待的是所有这些小污迹和噪音的轮廓都应该从轮廓列表中删除contours,但我仍然得到了这个垫子(在这些小污迹周围也绘制了绿色轮廓):

在此处输入图像描述

此外,Log.i()以下代码中的消息打印:

最初的轮廓数:27

处理后的轮廓数:27




编辑:

  1. 我替换(10/100)0.1,实际上为了清楚起见,我决定在0.5这个例子中使用。这样,所有小于最大轮廓面积一半的轮廓都应该被删除。

  2. 因此,在这里和那里的一些Log.i语句之后,我意识到第二个 while 循环没有被执行。经过一番摆弄Iterator然后下台foreach循环,我得到了ConcurrentModificationException,所以我终于发现解决方案是一个for循环,如下所示。

问题:(a)我仍然得到相同Mat的 s,而如果您查看以下代码片段以及此页面底部的 logcat 输出中maximumContourArea的 s 和s 的值currentContourArea,您会注意到只有一个轮廓,具有面积的1719.0应该保留,所有其他的都应该删除。(b) 查看以下代码后的 Logcat 输出。

代码更改:

Logcat 输出:


好的,我替换contours.remove(currentContour);为,Log.i(TAG, "PNM A contour with an area of " + Imgproc.contourArea(contours.remove(currentContour)) + " is being removed.");因为ArrayList'remove()方法返回被删除的东西(轮廓)。(来源

我也在currentContour--;此声明之后添加。

以下是 Logcat 消息:

^ 似乎正在工作。现在唯一存在的问题是,为什么当最后一次执行以在原始图像上绘制绿色轮廓时,我要绘制所有轮廓(甚至是那些围绕着那些 lil 污迹的轮廓) 。drawContours()

0 投票
1 回答
147 浏览

opencv - 聚 opencv 半透明

我的问题是针对 Opencv 专家的,我已经检测到道路线(左右线),所以我的目标是用半透明的蓝色绘制道路区域。所以我用:

ppt-包含左右的点,npt-点数

但是,我得到的东西填满了道路上的区域,这不是我的目标。

那么,我的问题是有什么解决方案可以用半透明的方式绘制道路区域吗?我被告知要添加另一个频道,例如:

但问题是我得到了半透明的所有图像,我只想要道路区域。任何想法表示赞赏!

谢谢

0 投票
1 回答
1445 浏览

python - 带识别的opencv运动跟踪器

目前,下面的脚本工作得很好,但我现在想给每个矩形边界框一个标识符。

例如,给定下图:

我希望能够将四个矩形边界中的每一个识别为一个对象。(即最左边是方块皇后卡的绑定框,最右边是红桃A的绑定框)

现在,我很困惑我怎么可能做到这一点,想知道是否有人能给我灵感

0 投票
1 回答
1728 浏览

c++ - 搜索一个轮廓是否存在于另一个轮廓内

我有两个轮廓向量OUTERCONT和INNERCONT在openCV中定义为向量(向量(点))。我想检查一个轮廓是否存在于另一个轮廓中。我还想知道,每个 OUTERCONT 中存在多少个轮廓。我目前正在围绕每个轮廓绘制一个 minEnclosureRect 并检查以下内容:

这似乎不起作用,它总是将计数返回为 120 左右的某个数字,这是不对的。您能否建议任何更改以使其正常工作?

注意:我不能使用层次结构,因为这是从 2 个不同函数返回的两组单独的轮廓。

我知道 PointPloygon 测试是一种选择,但你能建议更多的方法吗?

0 投票
0 回答
966 浏览

opencv - Opencv 如何在曲线上获得更平滑的轮廓?

我面临一些问题,以获得更平滑的曲线轮廓。经过图像处理后,我得到了这个图像。

在此处输入图像描述 我正在尝试使用此代码获得更平滑的曲线:

结果是这样的:

https://dl.dropboxusercontent.com/u/710615/testEhhancBwColor_.jpg

正如您在这张图片中看到的那样,这是一个“缩放”,我没有取得任何成功。

在此处输入图像描述

0 投票
1 回答
3601 浏览

c# - 浏览 FindContours 方法找到的轮廓层次结构?

这对于直接使用 OpenCV 的 C++ 开发人员来说一定很简单。但是,我使用的是 Emgu(.NET 的 OpenCV 包装器),在最新版本中,我们有CvInvoke.FindContours返回 void 的方法,输出结果由参数引用传递,类型为VectorOfVectorOfPoint.

这是一个简单的调用:

对于RetrType.List模式,我们可以将结果转换为一些数组并轻松地遍历所有轮廓。但是在这里,我想浏览树中的所有轮廓。我想我们必须在这里使用指针(通过Ptr输出结果的属性访问)对本机(不安全)C++ 代码做一些事情。但我想知道是否有更适合 .NET 的解决方案。如果即使使用指针是唯一的解决方案,我仍然不知道如何深入研究它Ptr以浏览轮廓树。

Emgu 安装附带的示例代码有一个片段 using CvInvoke.FindContourTree(并返回 a int[,])。

0 投票
1 回答
2377 浏览

c++ - 计算opencv中轮廓内的子轮廓数

我有这个源图像

在此处输入图像描述

我已经应用了二进制阈值来得到这个

在此处输入图像描述

我使用轮廓来区分具有子轮廓的轮廓和没有子轮廓的轮廓。结果图片是

在此处输入图像描述

但是如何计算每个绿色轮廓包含的子轮廓的数量?这是我用过的代码:-

EDIT-1-我在最后添加了来自 Humam 的代码以检查它:

但我得到的输出是这样的:

0 投票
1 回答
1196 浏览

python - Opencv:值错误

我已经检测到轮廓并将它们存储在cnts中,并且我正在逐一访问它们,c_list是我感兴趣的轮廓列表。我想使用以下代码检查我现在访问的轮廓是否已经被访问过:

我仍然收到错误

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

有人可以纠正我做错了什么吗?

0 投票
1 回答
296 浏览

c++ - OpenCV C++,不使用归零功能怎么会黑屏?

我怎么需要这条线?

就像如果我注释掉那行然后在它下面的其余代码中将变量“drawing”更改为“img”,我运行它时怎么会出现黑屏?而不仅仅是精巧的转换图像,它使除了轮廓线之外的照片的其余部分变黑?我假设从我读到的零函数将图片中矩阵的值更改为 0 使其变为黑色,这将导致 for 循环在仅显示轮廓线的黑色图片上绘制。

0 投票
0 回答
451 浏览

android - 如何在 Android 的 CameraView 中应用 FloodFill 算法(图像处理)?

我已经实现了ImageView中FloodFill算法的实现。但我无法在相机(Android 的表面视图)上实现它。我正在使用 OpenCV 库来做这件事。我已经使用轮廓概念尝试了以下代码。但我没有得到确切的结果。

任何人都知道如何做到这一点。提前致谢。