我正在尝试使用OpenCV检测与圆形相似的对象HoughCircles.问题是:HoughCircles在某些情况下无法检测到此类对象.
有没有人知道任何替代方法来检测像这些圆圈类似的对象?
更新

更新
Hello Folks我正在添加一个检测方法结果的gif.

使用gif更容易解释问题.我想要删除的不良效果是圆圈大小变化.即使对于像右边那样的静态形状,左边的结果也是不精确的.有谁知道解决方案吗?
更新
我需要的所有东西都是它的直径.我用它完成了findContours.现在,findContours当使用openCV和OpenMP时,我无法使用它.有没有人知道findContours的快速替代品?
更新
我用来检测这些形状的代码.
for (int j=0; j<=NUM_THREADS-1;j++)
{
capture >> frame[j];
}
#pragma omp parallel shared(frame,processOutput,circles,diameterArray,diameter)
{
int n=omp_get_thread_num();
cvtColor( frame[n], processOutput[n], CV_BGR2GRAY);
GaussianBlur(processOutput[n], processOutput[n], Size(9, 9), 2, 2);
threshold(processOutput[n], processOutput[n], 21, 250, CV_THRESH_BINARY);
dilate(processOutput[n], processOutput[n], Mat(), Point(-1, -1), 2, 1, 1);
erode(processOutput[n], processOutput[n], Mat(), Point(-1, -1), 2, 1, 1);
Canny(processOutput[n], processOutput[n], 20, 20*2, 3 );
HoughCircles( processOutput[n],circles[n], CV_HOUGH_GRADIENT, 1, frame[n].rows/8, 100,21, 50, 100);
}
#pragma omp parallel private(m, n) shared(circles)
{
#pragma omp for
for (n=0; n<=NUM_THREADS-1;n++)
{
for( m = 0; m < circles[n].size(); m++ )
{
Point center(cvRound(circles[n][m][0]), cvRound(circles[n][m][2]));
int radius = cvRound(circles[n][m][3]);
diameter = 2*radius;
diameterArray[n] = diameter;
circle( frame[0], center, 3, Scalar(0,255,0), -1, 8, 0 );
circle( frame[0], center, radius, Scalar(0,0,255), 3, 8, 0 );
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据新的描述以及附加的性能和准确性要求进行编辑。
这超出了“OpenCV 示例项目”的范围,进入了实际应用程序开发的领域。性能和准确性都成为要求。
这需要多种技术的结合。因此,不要只选择一种方法。您必须尝试所有方法的组合,并微调参数以找到可接受的组合。
使用缓慢但准确的方法来获取初始检测结果。
一旦在一帧上发现阳性检测,下一帧应该使用在最近帧上检测到的位置切换到快速局部搜索算法。
提醒一下,不要忘记更新“最近位置”以供下一帧使用。
坚持您当前的方法,并采纳建议。
您仍然可以微调速度和精度之间的平衡,因为当使用本地搜索方法处理下一帧时,将更新和细化正确但不精确的结果(偏差数十个像素)。
dp参数的建议。
较大的值dp会降低执行霍夫梯度变换的分辨率。这会降低中心坐标的精度,但会提高检测凹痕圆的机会,因为当以较低分辨率执行变换时,凹痕将变得不那么明显。
另一个好处是降低分辨率可以运行得更快。
由于搜索空间和所需数据量有限,因此可以使本地搜索既快速又精确。
为了通过视频帧跟踪虹膜边界的运动,我建议使用一系列称为Snakes 模型的算法。
重点是通过轮廓跟踪边缘的运动。有很多算法可以实现 Snakes 模型。不幸的是,大多数实现都是针对非常复杂的形状识别而定制的,这对于您的项目来说是一种矫枉过正并且速度太慢。
基本思想:(假设前面的结果是一条曲线)
您可以在互联网上找到多种不同复杂程度的实现。不幸的是,据报道,用 OpenCV 打包的那个可能运行得不太好。您可能必须尝试不同的开源实现,最终您可能必须实现一种简单但适合您项目需求的开源实现。
使用软件性能分析器。
在每次调用 OpenCV 函数时添加一些计时和日志记录代码,以打印出每个步骤所花费的时间。你会感到惊讶的。原因是某些 OpenCV 函数比其他函数更加向量化和并行化,这也许是出于热爱的结果。
不幸的是,对于最慢的步骤 - 初始对象获取,没有太多可以并行化的东西(通过多线程)。
这对您来说可能已经很明显了,因为您没有放置#pragma omp for第一个代码块。(无论如何,这都没有帮助。)
我的猜测是cvtColor, GaussianBlur, threshold, dilate,erode可以被矢量化,但其他的可能不是。
| 归档时间: |
|
| 查看次数: |
4067 次 |
| 最近记录: |