使用OpenCV 3查找对象的顺序

时间:2017-07-07 14:52:12

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

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

让我先解释一下这项任务。 有一个由16个单独的正方形组成的图案,每个正方形为红色,黄色或蓝色。我们正在使用相机模块在四轴飞行器上安装rasperry pi并收集模式的视频输入。

我们必须通过对网络的一点研究来检测容易实现的方块颜色。棘手的部分是我们必须检测正方形的顺序,以便按顺序保存数组中的颜色。

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

highly distorted image

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

为了找到订单,我们尝试了几种找到角落的OpenCV方法。有了角点,我们比较了每个点和确定的终点,这样我们就可以绘制一个边界正交角并克服很少的扭曲。

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

{{3}}

通过比较它们的中心点找到这些方块的顺序是不对的。它也无法找到端点在它们周围绘制一个更大的矩形来展平图案。然后订购...

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

取两个距离最远的中心并将它们编号为1和16.然后找到距离线1-16,左边(第4个)和右边(第13个)最远的两个中心。现在你有四个角落。

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

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

enter image description here

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