与一群朋友一起,我们正在尝试使用OpenCV库在Raspberry Pi上完成计算机视觉任务,使用C ++进行编码。
让我先解释一下这项任务。 有一个由16个单独的正方形组成的图案,每个正方形为红色,黄色或蓝色。我们正在使用相机模块在四轴飞行器上安装rasperry pi并收集模式的视频输入。
我们必须通过对网络的一点研究来检测容易实现的方块颜色。棘手的部分是我们必须检测正方形的顺序,以便按顺序保存数组中的颜色。
到目前为止,我们已经完成了对所需颜色(红色,黄色,蓝色)的过滤以确定方块。
在第二张图片中,我们知道每个方块的颜色和中心点。我们需要的是一种将它们按顺序写入文件或屏幕的方法。
为了找到订单,我们尝试了几种找到角落的OpenCV方法。有了角点,我们比较了每个点和确定的终点,这样我们就可以绘制一个边界正交角并克服很少的扭曲。
但由于四轴飞行器获得视频流,因此总是存在高失真的可能性。这会弄乱我们的角落理论,导致错误的颜色顺序。例如,它可以捕获这样的图像:
{{3}}
通过比较它们的中心点找到这些方块的顺序是不对的。它也无法找到端点在它们周围绘制一个更大的矩形来展平图案。然后订购...
我要求的是算法建议。我们是否总是朝错误的方向寻找角落?是否可以在不考虑失真的情况下确定顺序?
提前致谢。
答案 0 :(得分:0)
取两个距离最远的中心并将它们编号为1和16.然后找到距离线1-16,左边(第4个)和右边(第13个)最远的两个中心。现在你有四个角落。
计算将角1,4和13的坐标映射到(0,0),(3,0)和(0,3)的仿射变换。将此变换应用于16个中心并舍入到最接近的整数。如果一切顺利,您将获得方块的“逻辑”坐标,范围为[0,3] x [0,3]。映射到单元格索引是立即的。
请注意,由于对称性,将保留四倍不确定性,您可以通过检查颜色模式来解除这种不确定性。
此过程对变形非常稳健。如果有极端的视角,你甚至可以利用四个角来确定一个单应变换而不是仿射。在你的情况下,我怀疑这将是有用的。您可以通过检查是否已分配所有预期索引来评估正常工作。