- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的、人为的示例,使用 cvFindContours 和 OpenCV C API 在二进制图像上查找连接的组件。 (这是用 C 编写的较大软件的一部分,因此不能选择使用 C++ API。)
示例输入图像由黑色背景上两个不重叠的填充白色方 block 组成。我希望从中得到两个轮廓,代表构成每个正方形周长的连接组件。相反,我得到了四个组件。为什么?详细信息如下。
首先,我将输入图像设置为“self”阈值,这是一个 CV_32FC1 图像,背景像素为 0.0,白色像素(两个方 block )值为 1.0:
cvThreshold(self, self, 0.8, 1.0, CV_THRESH_BINARY);
然后,我使用 cvScale 将输入图像复制到相同大小的 CV_32SC1 图像:
CvMat * temp = cvCreateMat(height, width, CV_32SC1);
cvConvertScale(self, temp, 1, 0);
然后我执行 cvFindContours 来获取连接的组件:
CvSeq * components = 0;
CvMemStorage * mem = cvCreateMemStorage(0);
cvFindContours(temp, mem, &components, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
然后,我执行以下操作来输出构成轮廓的点并将它们绘制到窗口中。
for(; components != 0; components = components->h_next)
{
printf("===============NEW COMPONENT!============\n");
if (components->v_next) printf("This has a child.\n");
CvPoint * pt_array = (CvPoint *)malloc(components->total*sizeof(CvPoint));
cvCvtSeqToArray(components, pt_array, CV_WHOLE_SEQ);
for (int i = 0; i < components->total; i++)
{
printf("Point %i: %i, %i\n", i, pt_array[i].x, pt_array[i].y);
}
free(pt_array);
outer_color = CV_RGB(rand()%255, rand()%255, rand()%255);
cvDrawContours(dst, components, outer_color, inner_color, -3, 1, 8, cvPoint(0,0));
}
我希望这会产生两个轮廓,代表我的二值图像中两个白色方 block 的周长。相反,我得到了四个顶级轮廓,它们大约彼此重叠。给出了什么?
四个等高线中的点如下:
===============NEW COMPONENT!============
Point 0: 200, 150
Point 1: 200, 199
Point 2: 199, 200
Point 3: 150, 200
Point 4: 149, 199
Point 5: 149, 150
Point 6: 150, 149
Point 7: 199, 149
===============NEW COMPONENT!============
Point 0: 150, 150
Point 1: 150, 199
Point 2: 199, 199
Point 3: 199, 150
===============NEW COMPONENT!============
Point 0: 50, 10
Point 1: 50, 49
Point 2: 49, 50
Point 3: 10, 50
Point 4: 9, 49
Point 5: 9, 10
Point 6: 10, 9
Point 7: 49, 9
===============NEW COMPONENT!============
Point 0: 10, 10
Point 1: 10, 49
Point 2: 49, 49
Point 3: 49, 10
最佳答案
这是在黑暗中拍摄的,但我知道轮廓方法标志控制结果集结构。也许尝试将 CV_RETR_CCOMP 标志与描述的标志之一交换 here .
这个link解释一下标志 CV_RETR_CCOMP 的工作原理。
但这很奇怪,我也不希望你得到这样的结果。
关于cvFindContours 没有产生我期望的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121050/
我有一个简单的、人为的示例,使用 cvFindContours 和 OpenCV C API 在二进制图像上查找连接的组件。 (这是用 C 编写的较大软件的一部分,因此不能选择使用 C++ API。)
我正在创建实时软件,因此经常在全黑蒙版上调用 cvFindContours。如果是这种情况,cvFindContours 会抛出异常,程序会崩溃。 如果 cvFindContours 无法找到轮廓,我
轮廓检测占用了我计算机视觉的大部分时间,它需要更快。我已经通过 NEON 指令和矢量化优化了其他所有内容,实际上,轮廓检测在配置文件中占主导地位。不幸的是,如何优化它对我来说并不明显。 我正在执行经典
我在 c++ 和 openCv 2.1 中使用 cvFindContours 函数,因为我必须对我正在使用的函数做一个文档,有人能告诉我这个函数是如何工作的,使用哪种查找轮廓的方法,如果可能的话一些理
我正在继续使用 openCV,这是我描述的第一次冒险 here 。一切进展顺利,但我偶然发现了另一件棘手的事情。我想在应用了自适应阈值的图像上找到轮廓: 因此,cvFindContours 似乎工作得
我可以使用 cvFindContour 在我的网络摄像头捕获中绘制一些轮廓,但现在我想将每个轮廓存储到某个对象中。 这里的目标是对相机捕获的事件对象进行检测,但我真的不知道如何处理这些轮廓。 有什么想
我试图在图像的一个小区域内找到连接的组件(如果有的话)。然而,cvFindContours() 函数将明显独立的组件分组为一个组件,从而导致进一步的计算不正确。 如何获取区域内的独立组件? (为函数检
我一直在玩弄 OpenCV,经过大量的反复试验,我学会了如何检测照片中的圆圈(硬币)。一切都很好,除非我将硬币直接并排放置(如下所示,请忽略第二张图片倒置的事实)。 似乎因为硬币靠得太近,cvFind
由于某些原因,谷歌没有使用 cvCalcPGH() 的好例子,也没有其他使用 Freeman 代码进行轮廓匹配的好例子。所以我试着做到: #include "opencv2/opencv.hpp" #
我正在使用 VS C++ 2010 专业版和 SP1。 我的代码: CvSeq* firstContour = NULL; int n = cvFindContours(grnt1,
我在我创建的一个单独的线程中调用 cvFindContours 函数来处理所有 OpenCV 工作,而另一个线程则保留用于 OpenGL 的东西。 我注意到当这段代码在一个单独的线程中执行时,我的 c
我是 OpenCV 的新手,在使用它时遇到了一些问题。 目前我正在研究二叉分区树 (BPT) 算法。基本上我需要根据一些参数将图像分成许多区域。 2个区域将合并形成1个新区域,由这2个区域组成。 我设
请有人解释一下 cvFindContours 方法及其需要的参数是什么? 例如,这里是使用 OpenCV 的代码: hierarchy = cv2.findContours(thresh, cv2.R
我在 StackOverflow 中解决了许多问题,并且能够开发小程序来正确检测正方形和矩形。这是我的示例代码 public static CvSeq findSquares(final IplIma
我正在使用 OpenCV 比较两幅图像中的两个 Blob 。假设我知道一对可能相似的 Blob ,我知道它们的索引在轮廓数组中(由 cvFindContours() 生成),我怎样才能得到在恒定时间内
我正在使用 opencv 2.4.2 库检测边缘并在图像上查找四边形形状。一切都很顺利,直到我遇到这些编译错误 ../src/GoodFeaturesToDetect.cpp:198:109: err
我是一名优秀的程序员,十分优秀!