【问题标题】:Finding order of objects with OpenCV 3使用 OpenCV 3 查找对象的顺序
【发布时间】:2017-12-11 22:21:04
【问题描述】:

和一群朋友,我们正在尝试在 Raspberry Pi 上完成一项计算机视觉任务,使用 OpenCV 库使用 C++ 进行编码。

让我先解释一下任务。 有一个由 16 个独立的正方形组成的图案,每个正方形是红色、黄色或蓝色的。我们正在将 rasperry pi 安装在带有摄像头模块的四轴飞行器上,并收集该模式的视频源。

我们必须检测正方形的颜色,这很容易通过对网络的一些研究来完成。棘手的部分是我们还必须检测正方形的顺序,以便按顺序将颜色保存在数组中。

到目前为止,我们已经完成了对所需颜色(红色、黄色、蓝色)的过滤以确定正方形。

example pattern to recognize and our process so far

在第二张图片中,我们知道每个正方形的颜色和中心点。我们需要的是一种将它们按顺序写入文件或屏幕的方法。

为了找到顺序,我们尝试了几种找到角点的 OpenCV 方法。手边有角点,我们比较了每个点并确定了端点,这样我们就可以绘制一个边界矩形并克服一些扭曲。

但由于四轴飞行器获取视频流,因此总是存在高失真的机会。这会扰乱我们的角点理论,导致颜色顺序错误。例如,它可以捕获这样的图像:

highly distorted image

通过比较它们的中心点来找到这些正方形的顺序是不对的。它也无法找到端点以在它们周围绘制更大的矩形以展平图案。然后下单……

我要求的是算法建议。我们在寻找角落时是否完全走错了方向?是否可以在不考虑失真的情况下确定顺序?

提前致谢。

【问题讨论】:

  • 使用 cv::minAreaRect 得到一个围绕所有框的旋转边界矩形。然后选择一个角作为网格的左上角(变形 >= 45 度不明确)并计算相对于旋转边界矩形的中心点内容(例如,通过将所有中心点向后旋转)。
  • 使用旋转的边界矩形作为基础,您甚至可以猜测网格(如果您知道网格大小)并选择最适合每个猜测的网格位置的分段颜色框。

标签: c++ opencv image-processing color-detection


【解决方案1】:

取距离最远的两个中心,分别编号为 1 和 16。然后找到离 1-16 行最远的两个中心,分别位于左侧(编号 4)和右侧(编号 13) .现在你有了四个角。

计算将角点 1、4 和 13 的坐标映射到 (0,0)、(3,0) 和 (0,3) 的仿射变换。将此变换应用于 16 个中心并四舍五入到最接近的整数。如果一切顺利,您将获得正方形的“逻辑”坐标,范围为 [0, 3] x [0, 3]。立即映射到单元格索引。

请注意,由于对称性,将保留四重不确定性,您可以通过检查颜色模式来消除它。

此过程对变形非常稳健。如果存在极端透视,您甚至可以利用四个角来确定单应变换而不是仿射。在你的情况下,我怀疑这会有用。您可以通过检查是否已分配所有预期的索引来评估是否正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 2013-08-21
    • 2012-06-03
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多