机器人技术的兴起特别是自动车辆的兴起推动了机器视觉的发展。有许多不同的方法可以帮助机器人定位、导航、避免碰撞等。其中一些方法需要非常全面的人工智能算法、庞大的训练数据集和昂贵的硬件。在本文中,我将展示一种相对简单而强大的算法,它既不需要训练,也不需要强大的硬件来运行。你所需要知道的就是机器人想要探测到什么样的物体。这个算法能精确地探测到物体的位置,它的精度非常高。
应用场景
让我们假设我们有一个输送机,可以提供不同尺寸的箱子和一个需要将它们堆放在不同托盘上的机器人。为了能够做到这一点,机器人需要检测盒子类型及其位置。例如,盒子的位置可以由(x, y)坐标以及盒子的一条边与沿输送带对齐的x轴之间的角度来定义。机器人只有一个固定在传送带上方的摄像头。
![48057cda0a9e8864dea926e621c16ef3.png](https://i-blog.csdnimg.cn/blog_migrate/fef254e9d8a63779912715c6e5dce0bc.jpeg)
导入Python库
from IPython.display import Lateximport numpy as npfrom PIL import Imagefrom PIL import ImageDraw# import matplotlib# matplotlib.use("Agg")from matplotlib import pyplot as plt# import matplotlib.animation as manimation
![3caf9e233dcb3138b6ccf475d9ab5d56.png](https://i-blog.csdnimg.cn/blog_migrate/d4b54023453dda40ff7e761a7cd61172.jpeg)
相机设置
我们将生成大量虚拟图像,这些图像对应于传送带中盒子的不同位置。出于这个原因,我们需要知道相对于与输送机相关的参考系的相机坐标及其角度,我们将其称为全局参照系。
![f45957cf7e8ac6bafff5dcd844de9c88.png](https://i-blog.csdnimg.cn/blog_migrate/fc6dfb0e036e02dd2bfd75941ccbe894.jpeg)
图1 摄像机设置
通过了解相机的坐标和角度,我们可以找到相机的外部矩阵,而相机的内部矩阵是由它的属性如焦距和像素数来指定的。内部矩阵可以很容易地通过一个标准相机校准程序找到。
因此,将全局参照系中的任何三维向量转换成图像像素的矩阵都可以作为内部矩阵和外部矩阵的点积找到,我们称之为M:
![22195b364d632883510547b0a1230f5f.png](https://i-blog.csdnimg.cn/blog_migrate/07b14f686195aae851a86fd769a98689.jpeg)
因此,我们发现由相机矩阵定义的3D / 2D变换允许我们生成不同状态的盒子的虚拟图像。Python代码如下:
# Let us define intrinsic camera matrix and camera locationK = np.array([[600., 0., 300.], [0., 600., 200.], [0., 0., 1.]])cam_xyz = np.array([[0, -1., 1.5]]).T# let us find extrinsic camera matrixdef get_zxz(a, b, g): """returns rotation matrix according to ZXZ euler schema """ c1, s1 = np.cos(a), np.sin(a) c2, s2 = np.cos(b), np.sin(b) c3, s3 =