【问题标题】:3d points project 2d points error3d 点投影 2d 点错误
【发布时间】:2019-02-01 19:15:08
【问题描述】:

我尝试使用cv2.projectpoints 将人体骨骼 3d 点投影到 2d 点。

这是我的代码:

tmp = np.array(data_3d['root'][i]).reshape(1,3)
revc = np.array([0, -15, -25], np.float)  # rotation vector
tvec = np.array([-2, -2, -12], np.float)  # translation vector
fx = fy = 1.0
cx = cy = 0.0
cameraMatrix = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
result = cv2.projectPoints(tmp, revc, tvec, cameraMatrix, None)

但我在投影过程中发现了一些奇怪的二维点。

root:
     X min_max=(-166.92720209469152, 1243.4813901875507)
       mean=4.290786012592475, variance=4722.3197294835645
     Y min_max=(-402.9192018458054,55.87842522603996)
       mean=0.11309526315136062, variance=499.5386080289831
head:
     X min_max=(-1757.835481879438, 425.7047344280786)
       mean=-4.077206416367477, variance=10165.268433754276
     Y min_max=(-426.06627880880535, 104.67033311809274) 
       mean=0.14534586064178603, variance=600.3554834467959

所以我把这些打印出来

看起来,有一些奇怪的变化。

40 => 80 => 190 => 425 => -1757 => -268 => -60 => -33

我的问题是为什么会发生这种奇怪的事情?

我认为一开始可能是遮挡,但head 不会被遮挡。

【问题讨论】:

    标签: opencv 3d camera projection


    【解决方案1】:

    旋转矢量rvec 以弧度为单位,而不是度数。而是将其声明为:

    revc = np.rad2deg(np.array([0, -15, -25], np.float))  # rotation vector
    

    另外,fx=fx=1 的焦距以米为单位,我怀疑你的相机的焦距是 1 毫米。如果你的焦距是 1 毫米,不如说:

    fx = fy = .001 # in meters
    

    如果您需要更多帮助,不如在图像上绘制这些点,然后向我们展示图像。这也将使您对投影的外观有一个很好的了解。这可以通过以下方式完成:

    from matplotlib import pyplot as plt
    plt.scatter(*zip(*result[0][:,0,:]))
    plt.show()
    

    另外,下面的意思是什么?

    看起来,有一些奇怪的变化。

    40 => 80 => 190 => 425 => -1757 => -268 => -60 => -33

    【讨论】:

    • 谢谢!修改这些后,它的方差确实下降到正常水平。关于425 => -1757 => -268,我的意思是2d点x有一些奇怪的变化,导致高方差。
    • 雷完全没问题,很高兴能帮上忙。如果您想让其他人知道这是一个有帮助的答案,请记住Accept as Answer(如果您愿意,请记住Upvote)。如果您还有其他问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2019-06-08
    • 2012-09-03
    • 2011-07-29
    • 1970-01-01
    • 2010-09-09
    • 2023-03-08
    相关资源
    最近更新 更多