簡體   English   中英

斷言在OpenCV的solvePNP上的點數失敗

[英]Assertion fails for the number of points, on OpenCV's solvePNP

考慮以下代碼:

  std::vector<cv::Point2f> vecUV = Vec2DFromFile(argv[2]);
  std::vector<cv::Point3f> vecXYZ = Vec3DFromFile(argv[3]);

  cv::Mat matCalib(3, 3, CV_64F);
  cv::setIdentity(matCalib);

  cv::Mat matRot(3, 1, CV_64F);
  cv::Mat matTrans(3, 1, CV_64F);

  cv::Mat matDistortion = cv::Mat::zeros(4, 1, CV_64F);

  cv::solvePnP(vecUV, vecXYZ, matCalib, matDistortion, matRot, matTrans);

vecUV和vecXYZ的大小均為4。這將失敗,並顯示:

OpenCV(3.4.1) Error: Assertion failed (( (npoints >= 4) || (npoints == 3 && flags == SOLVEPNP_ITERATIVE && useExtrinsicGuess) ) && npoints == std::max(ipoints.checkVector(2, 5), ipoints.checkVector(2, 6))) in solvePnP, file /var/tmp/portage/media-libs/opencv-3.4.1-r5/work/opencv-3.4.1/modules/calib3d/src/solvepnp.cpp, line 65
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.1) /var/tmp/portage/media-libs/opencv-3.4.1-r5/work/opencv-3.4.1/modules/calib3d/src/solvepnp.cpp:65: error: (-215) ( (npoints >= 4) || (npoints == 3 && flags == SOLVEPNP_ITERATIVE && useExtrinsicGuess) ) && npoints == std::max(ipoints.checkVector(2, 5), ipoints.checkVector(2, 6)) in function solvePnP

我不明白為什么斷言失敗,因為每個向量有4點。 我嘗試使用gdb進入,但無濟於事:

...
(gdb) s
cv::_InputArray::init (this=0x7fffffffe350, _flags=-2130509811, _obj=0x7fffffffe2f0)
    at /usr/include/opencv2/core/mat.inl.hpp:67
67      { flags = _flags; obj = (void*)_obj; }
(gdb) s
cv::_InputArray::_InputArray<cv::Point_<float> > (this=0x7fffffffe350, 
    vec=std::vector of length 4, capacity 4 = {...}) at /usr/include/opencv2/core/mat.inl.hpp:85
85      { init(FIXED_TYPE + STD_VECTOR + traits::Type<_Tp>::value + ACCESS_READ, &vec); }
(gdb) s
OpenCV(3.4.1) Error: Assertion failed (( (npoints >= 4) || (npoints == 3 && flags == SOLVEPNP_ITERATIVE && useExtrinsicGuess) ) && npoints == std::max(ipoints.checkVector(2, 5), ipoints.checkVector(2, 6))) in solvePnP, file /var/tmp/portage/media-libs/opencv-3.4.1-r5/work/opencv-3.4.1/modules/calib3d/src/solvepnp.cpp, line 65
terminate called after throwing an instance of 'cv::Exception'
0x00007ffff6e7334f in __gnu_cxx::__verbose_terminate_handler ()
   from /usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libstdc++.so.6

我已經讀過這個這個這個答案 ,但是似乎情況不一樣-在那里,應該歸咎於錯誤的參數類型。

.zip,帶有最少的可復制示例 -將輸入文件作為第二和第三個參數傳遞,保留第一個參數。

看一下OpenCV文檔 由於您使用的是3.4.1版本,因此solvePnP的文檔在此處

首先是objectPoints然后是imagePoints

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM