다음 코드를 고려하십시오.
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
나는 this , m this and this answer 을 읽었 지만 동일한 경우가 아닌 것 같습니다. 잘못된 매개 변수 유형이 비난되었습니다.
재현 가능한 최소한의 예제가있는 .zip- 입력 파일을 두 번째 및 세 번째 매개 변수로 전달하고 첫 번째 매개 변수는 예약됩니다.
OpenCV 문서를 살펴보십시오 . 3.4.1
버전 을 사용하고 있으므로 에 대한 설명서 solvePnP
는 여기에 있습니다 .
그 objectPoints
다음 은 먼저 imagePoints
입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다