OpenCV Python solvePnP 的 EPnP 实现与官方 MATLAB EPnP 实现产生的输出不同

问题描述

最近我正在研究用于计算机视觉的 solvePnP 算法。我在 MATLAB 中找到了官方的 EPnP 算法https://github.com/cvlab-epfl/EPnP

我正在通过 Python API 将官方实现的结果与 OpenCV 版本的结果进行比较。

用这两种方法运行一个简单的例子,给我不同的 R 矩阵和 t 向量。 t 向量不同,并且 R 的上面两行的符号被翻转(参见下面代码示例下的输出)。我在这里错过了什么?

谢谢!

示例 Python 代码

import numpy as np
import cv2

cam_in = [[2445.72,0.0,819.29],[0.0,2442.39,660.13],1.0]]
          
# 3p model from opencv
objPts = [[  0.,0.,0. ],[ 82.5,[165.,[247.5,[ 55.,27.5,[137.5,[220.,[ 27.5,55.,[110.,[192.5,[  0.,82.5,110.,137.5,165.,0. ]]


imagePts = [[648.84735,335.1484 ],[522.6854,317.74222],[400.24448,301.46362],[281.39792,285.43964],[560.8046,366.6523 ],[437.57022,349.67358],[318.269,333.33557],[598.38196,415.80203],[475.02866,397.87906],[354.60062,380.84167],[636.9289,465.04666],[512.3496,446.39185],[391.26932,428.63168],[273.65057,411.7955 ],[549.6402,495.04532],[428.12842,476.45554],[309.60794,458.5343 ],[587.5397,543.42163],[465.2291,524.39795],[346.24826,505.79684],[624.71814,591.7365 ],[502.51782,572.03394],[382.8287,552.7545 ],[266.8465,534.29364]]

cam_in,objPts,imagePts = [np.array(x) for x in [cam_in,imagePts]]
distortion = None
ret,rvec,T = cv2.solvePnP(objPts,imagePts,cam_in,distortion,flags=cv2.soLVEPNP_EPNP)
R,_ = cv2.Rodrigues(rvec)

print('R')
print(R)
print()
print('T:')
print(T)

使用 Octave 的 MATLAB 代码示例:

clear all
close all

cam_in = [[2445.72,819.29]; ...
          [0.0,660.13]; ...
          [0.0,1.0]]
          
% 3p model from opencv
objPts = [[  0.,0. ]; ...
          [ 82.5,0. ]; ...
          [165.,0. ]; ...
          [247.5,0. ]; ...
          [ 55.,0. ]; ...
          [137.5,0. ]; ...
          [220.,0. ]; ...
          [ 27.5,0. ]; ...
          [110.,0. ]; ...
          [192.5,0. ]; ...
          [  0.,0. ]];


imagePts = [[648.84735,335.1484 ]; ...
            [522.6854,317.74222]; ...
            [400.24448,301.46362]; ...
            [281.39792,285.43964]; ...
            [560.8046,366.6523 ]; ...
            [437.57022,349.67358]; ...
            [318.269,333.33557]; ...
            [598.38196,415.80203]; ...
            [475.02866,397.87906]; ...
            [354.60062,380.84167]; ...
            [636.9289,465.04666]; ...
            [512.3496,446.39185]; ...
            [391.26932,428.63168]; ...
            [273.65057,411.7955 ]; ...
            [549.6402,495.04532]; ...
            [428.12842,476.45554]; ...
            [309.60794,458.5343 ]; ...
            [587.5397,543.42163]; ...
            [465.2291,524.39795]; ...
            [346.24826,505.79684]; ...
            [624.71814,591.7365 ]; ...
            [502.51782,572.03394]; ...
            [382.8287,552.7545 ]; ...
            [266.8465,534.29364]];
         
[R T reprojectionPts] = efficient_pnp(objPts,cam_in);

display(R)
display(T)

Python 输出

R
[[-0.9553479  -0.10390386  0.27661231]
 [-0.15995044  0.96896901 -0.18845399]
 [-0.24844766 -0.22428338 -0.94232199]]

T:
[[-105.91385446]
 [-201.18325419]
 [1596.85002509]]

八度输出

R =

   0.95539   0.10395  -0.27644
   0.15990  -0.96902   0.18824
  -0.24830  -0.22405  -0.94242

T =

   -359.306
    -80.755
   1595.419

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...