- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
轮廓检测占用了我计算机视觉的大部分时间,它需要更快。我已经通过 NEON 指令和矢量化优化了其他所有内容,实际上,轮廓检测在配置文件中占主导地位。不幸的是,如何优化它对我来说并不明显。
我正在执行经典的矩形检测过程来查找基准标记,即 cvFindContours(),然后从等高线近似正方形。在许多标记可见的情况下(或者灾难性的,当不是标记的密集矩形网格可见时),在 iPhone 上单独调用 cvFindContours() 可能需要 >30 毫秒。
我已经用 cvFindContours() 替换了极其昂贵的 C++ cv::FindContours()。特别是如果传递一个向量 >,C++ 版本分配和填充向量的时间比其内部 cvFindContours() 花费的时间更长!
现在,我完全受制于 cvFindContours 中的时间,或者更具体地说,受制于 cvFindNextContour() 中的时间。 cvFindNextContour 中的代码分支繁多,显然不容易向量化。它还实现了一个复杂的算法,我不相信自己在任何优化尝试中都不会出错。
我已经看过 cvBlobLib(为了消除歧义,我指的是这个:http://code.google.com/p/cvblob/),看看它是否提供了可以更快地完成同样事情的替代算法。源的基本下载非常慢,因为它将轮廓记录到 std::list() 中,并且几乎所有时间都花在内存分配上。用 std::vector 替换该列表以消除 push_back() 上的初始副本,仍然留下一个比 cvFindContours() 长 3 倍的函数,其中 66% 直接在 cvb::cvLabel( ).所以走这条路似乎不可行。
有没有人对我如何优化许多矩形的检测有任何想法。我模糊的挥手包括:
是否有任何与 cvFindContour() 等效的快速实现,最好是源代码,因为我是多平台的?
大部分轮廓都不是必需的,只有“成功”的矩形有用。特别是,它们的内部轮廓就没有用了。从理论上讲,我是否可以根本不调用 cvFindContours,而是调用 cvStartFindContours/cvFindNextContour,测试找到的每个轮廓,如果我找到了我正在寻找的矩形,则不递归,因为子矩形肯定是无用的?
我可以使用与经典 FindContours()/ApproxPoly() 方法完全不同的矩形检测算法吗?
有没有办法用有用的感兴趣区域“填充”cvFindContours?例如。 FAST 角点检测几乎总能返回我的基准标记角点,即使阈值非常高。有没有办法使用那个点集来限制检测? (不幸的是,我不确定这有多大帮助,同样是在许多标记或与标记无关的密集网格线的情况下,这在我的应用中经常发生。)
与上述相同,由于 Blob 检测可以(如果我理解正确的话)作为递归洪水填充来实现,是否有任何快速矢量化实现可以用来以某种方式提取有趣的 Blob矩形,并从那里进行种子轮廓检测?
欢迎任何想法!
最佳答案
由于您的目标是矩形检测而不是轮廓检测,因此我建议使用积分图像进行计算。可以找到积分图像的解释 here .在计算出所需图像的积分图像后,可以通过三个操作来计算矩形的像素和。
假设您想在每个非黑色对象周围绘制矩形,您可以使用如下方法。递归地继续将图像及其子图像划分为 4,并丢弃像素总和低于所需阈值的矩形。您将留下许多近似于您的对象的小矩形。合并相邻的矩形将产生对检测到的对象的快速近似。
关于opencv - cvFindContour() 的更快替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335951/
我有一个简单的、人为的示例,使用 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
我是一名优秀的程序员,十分优秀!