【问题标题】:Dynamic Camera Caliberation OpenCV python3动态相机校准OpenCV python3
【发布时间】:2019-01-05 23:35:23
【问题描述】:

我正计划制作一个机械臂。我的手臂上安装了一个摄像头。我正在使用 Opencv 和 python3 来做 IP。

我希望手臂检测到地面上的点并且伺服系统相应地移动。我已经完成了检测和计算世界坐标的部分。此外,所需的逆运动学。

这里的问题是我已经将相机校准到一定高度(20 厘米)。因此,正确的世界坐标仅在 20 厘米的高度接收。我希望相机在向地面(向下)移动时每 2 秒校正一次读数。

有没有一种方法可以动态进行校准,并为我的手臂提供动态坐标?我不知道这是否是正确的方法。如果有其他方法可以做到这一点,请帮助。

【问题讨论】:

    标签: python-3.x opencv camera-calibration inverse-kinematics


    【解决方案1】:

    我假设您使用undistort 函数首先对图像进行不失真,然后使用旋转矢量(rcvt)和平移矢量(tvct)以及distortCoeffs 来获取世界坐标。正确的坐标只能在该特定高度获得,因为rvct 和tvct 将根据用于校准的(棋盘的)正方形大小而变化。

    克服这个问题的一个聪明方法是轻松消除旋转矢量和平移矢量。

    由于相机校准常数在任何高度/旋转都保持不变,因此可以在此使用。另外,不要每2秒校准一次(会消耗太多CPU),直接使用下面的方法来获取值!

    假设(img_x, img_y) 是您需要转换为世界坐标(world_x, world_y) 的图像坐标,cameraMatrix 是您的相机矩阵。对于这种方法,您需要知道distance_cam,即您的对象与相机的垂直距离。

    使用python和opencv,使用以下代码:

    import numpy as np
    from numpy.linalg import inv
    
    img_x, img_y = 20, 30 # your image coordinates go here
    world_coord = np.array([[img_x], [img_y], [1]]) # create a 3x1 matrix
    world_coord = inv(cameraMatrix) * world_coord # use formula cameraMatrix^(-1)*coordinates
    world_coord = world_coord * distance_cam 
    world_x = world_coord[0][0]
    world_y = world_coord[1][1]
    print(world_x, world_y)
    

    起初,我们可能没有意识到世界坐标中的单位并不重要。乘以相机矩阵的倒数后,您定义了 x/z 比率,它是无单位的。所以,你可以在任何单位中选择distance_cam,最终结果将以distance_cam为单位,也就是说,如果distance_cam在mm中,那么world_x, world_y也将在mm中.

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 2014-10-23
      • 1970-01-01
      • 2012-04-18
      • 2016-12-29
      • 2011-08-03
      • 2014-06-19
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多