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