You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++与Python版OpenCV solvePnP结果不一致求助

OpenCV solvePnP C++与Python版本结果不一致问题

我编写了逻辑一致的C和Python版OpenCV代码,但运行solvePnP后得到完全不同的结果。已知Python版本结果正确,C版本结果存在问题,无法排查原因。

C++代码及输出

std::vector<cv::Point2f> imgpnts { { 1095.5f, 1013.f },
                                   { 2382.f , 983.f  },
                                   { 2813.f , 1079.f },
                                 };

std::vector<cv::Point3f> objpnts { { -2.74f    , -2.822f    , 58.028999f },
                                   { 2.4030001f, -3.0179999f, 60.153f    },
                                   { 2.438f    , -3.029f    , 29.926001f },
                                 }; 

cv::Mat matrix = ( cv::Mat_<float>( 3, 3 ) << 15600, 0, 1920, 0, 15600, 960, 0, 0, 1 );
cv::Mat dist   = ( cv::Mat_<float>( 1, 5 ) << 0, 0, 0, 0, 0 );

cv::Mat tvec;
cv::Mat rvec;

cv::solvePnP( objpnts,
              imgpnts,
              matrix,
              dist,
              rvec,
              tvec,
              false, 
              cv::SOLVEPNP_SQPNP );

输出结果:

R [3.114110321750843;                                              
   -0.08173940943806265;                                                                          
   -0.1683807137960772]

T [5.679242612461503;                                                
   -1.657279779587383;                                                                                  
   117.6574177733892] 

Python代码及输出

img_pnts = [ [ 1095.5, 1013 ],
             [ 2382  , 983  ],
             [ 2813  , 1079 ],
           ]

obj_pnts = [ [ -2.74    , -2.822    , 58.028999 ],
             [ 2.4030001, -3.0179999, 60.153    ],
             [ 2.438    , -3.029    , 29.926001 ],
           ]

K = np.asarray([15600, 0, 1920, 0, 15600, 960, 0, 0, 1]).reshape(3, 3).astype(np.float32)
D = np.asarray([0, 0, 0, 0, 0]).reshape(1, 5).astype(np.float32)
 
f, R, T = cv.solvePnP(np.asarray(obj_pnts).astype(np.float32), 
                       np.asarray(img_pnts).astype(np.float32), 
                       K, D, flags=cv.SOLVEPNP_SQPNP)

输出结果:

R [[5.69669708e-03] [7.75121694e-05] [1.80173293e-02]]
T [[-0.5764531 ] [ 3.41078371] [ 3.62528898]]

版本信息

  • C++ OpenCV版本:4.5.3
  • Python OpenCV版本:4.6.0.66(安装自opencv-contrib-python)

内容的提问来源于stack exchange,提问作者Кирилл Фуярчук

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:02:41