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,提问作者Кирилл Фуярчук
相关产品推荐
相关产品推荐

