【问题标题】:I would like to detect a custom shape using OpenCV我想使用 OpenCV 检测自定义形状
【发布时间】:2017-04-21 03:50:29
【问题描述】:

我想检测下面的形状,我尝试了以下方法:

1) 使用opencv_traincascade 训练级联并使用opencv_createsamples 创建正图像 - 没有成功,有很多误报,对象没有很多特征。

2) 尝试进行椭圆检测,再次出现大量误报,因为场景中有很多椭圆。此外,它没有给出可靠的检测,因为它不是一个完美的椭圆。

3) 尝试过颜色检测,效果不错,但物体有多种颜色,从绿色、红色、蓝色和黄色不等,因此无法使用颜色进行检测。此外,它会因光照而变化。

我想知道是否可以使用边缘或其他自定义形状并在场景中检测的方式来训练分类器。

Results using canny edge detection

任何帮助将不胜感激。

【问题讨论】:

  • 你试过轮廓提取和cv::matchShapes吗?我发现倒角匹配非常好,但它需要一些特定于任务的优化来处理必要的情况,如对象旋转、对象缩放和透视扭曲。 docs.opencv.org/2.4/modules/imgproc/doc/…
  • 我会查看Nature Conservancy Kaggle 竞赛讨论板。有很多关于类似问题的讨论。
  • @Micka 谢谢你,我已经尝试过轮廓提取但没有尝试cv::matchShapes 会尝试一下。 @Tchotchke 太棒了,感谢您指出我的方向 - 将查看讨论。
  • @Micka 关于使用cv::matchShapes,为了获得整个图像的实时结果,想法是在不同的尺度上使用滑动窗口方法并使用返回到的系数区分匹配和不匹配?如果不是,那么如何提取包含匹配良好对象的边界框。
  • 您应该在边缘检测或阈值处理后提取轮廓(参见 cv::findContours)并比较形状(每个图像轮廓与目标轮廓)。如果可以的话,尽量提前消除轮廓(通过颜色或其他)。

标签: opencv image-processing machine-learning computer-vision pattern-recognition


【解决方案1】:

也许你可以尝试这样的事情。之后你就有了边缘图像:

  1. 使用findContours()获取分离的轮廓。
  2. 在黑色图像上绘制每个轮廓并使用convexHull 以获得具有该轮廓的形状。
  3. 为您的形状构建一个边缘模板并在其上应用convexHull:这将是您在每个新图像中都可以找到的模板。
  4. 对于每个新图像,计算 Normalized Cross Correlation 并找到具有最大相关性的坐标。

此方法有一个强有力的假设:您要查找的形状不会改变其旋转或缩放比例。如果您想保持旋转和缩放不变,您应该应用另一种方法来比较模板和图像(例如,旋转和缩放不变的模板匹配,例如:http://www.cv-foundation.org/openaccess/content_cvpr_2013/papers/Korman_FasT-Match_Fast_Affine_2013_CVPR_paper.pdf

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多