JinsnHS 2023-04-08 22:47 采纳率: 53.8%
浏览 107
已结题

如何使用OpenCV排除被遮挡的图形?

问题详解

我是准备参加比赛的学生,这个比赛会使用到 OpenCV 这样的库做来识别处理,我学习 OpenCV 的基础操作已经有一个多月了,目前遇到了一个非常棘手的问题:我会使用 OpenCV 来识别多边形,这种多边形有随机的五种类型及七种颜色,目前我已经把颜色和形状统计的问题解决了,但是被遮挡的图形却不知道怎么排除,具体内容在第二个栏目。

我尝试了什么?

我尝试使用安卓版本的 OpenCV 来解决多边形识别的问题,目前使用的办法是利用 inRange() 方法获得二值图,接着使用 findContours() 方法寻找轮廓,得到轮廓后进行开闭预算,紧接着使用 approxPolyDP() 方法进行多边形逼近,最后使用 convexHull() 方法检测角点来判断多边形是什么类型。这样能识别简单的多边形,但是这样也会识别被前景覆盖掉的多边形,被覆盖的多边形是无效的(应该被排除),请问我应该怎么做才能排除这些被覆盖的多边形?

示例图片

img

请问有人可以帮助我吗?非常感谢!请结合上面的图片解决问题,不要用chatGPT敷衍我,要是能做出来,酬金追加到100元。

  • 写回答

6条回答 默认 最新

  • youcans 领域专家: 人工智能技术领域 2023-04-10 23:31
    关注

    分析如下思路:
    (1)掩模图像,InRange 颜色分割,这样就消除了背景,提取到 指定颜色的图形。
    (2)大致来说,再对每个颜色 InRange 分割得到的二值图像,提取轮廓可以获得边缘,还可以在该图上进行霍夫线检测和圆检测。
    接下来就是 图形遮挡问题。
    (1)虽然问题条件没有明确,但从图中看没有 三层遮挡情况,也就是可以简化为 二层遮挡问题。具体来说,一个图形,可以被多个其它图像遮挡;但是一个像素上最多叠放了2个图像,没有一个像素上重叠了3个或以上的图形。
    (2)提取的遮挡图案的上层图形不需要分析,直接通过 InRange 分割可以求出。
    (3)提取到的遮挡图案的下层图形是在原始图案基础上,被一个或多个遮挡图案切除了局部。
    (4)如果是(被切除局部的)三角形/矩形/菱形/五角星的二值轮廓图像,可以对该轮廓依次做:
    1)最小外接圆,cv.minEnclosingCircle,检出圆形。如果原图形是圆形,则外接圆与遮挡轮廓有一定重合(设个阈值判断);如果原图形不是圆形,则外接圆与轮廓基本不重合。
    2)最小外接三角形,cv.minEnclosingTriangle,检出三角形。原理同上。
    3)轮廓的最小矩形边界框,cv.minAreaRect,检出正方形。原理同上。
    4)最后剩下 菱形和五角星,可以用轮廓的凸壳判断,cv.convexHull。如果原图形是菱形,则凸壳与遮挡轮廓有一定重合,而五角星的凸壳与遮挡轮廓没有重合。
    这样大致就可以解决了。
    但是,仍然只能说大致解决。为什么呢?因为如果菱形矩形被遮挡1/2以上,只剩下两条边,其实是无法判断原始图形是菱形矩形还是三角形的。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月10日
  • 修改了问题 4月9日
  • 修改了问题 4月8日
  • 创建了问题 4月8日