c++ - 在 OpenCV 的 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 具有最小可重现示例- 将输入文件作为第二个和第三个参数传递,第一个参数被保留。
解决方案
推荐阅读
- excel - 如何在 Application.Left 函数(需要范围或字符串)中使用拆分函数(变体)的结果?
- python - 如何将 Numpy 矩阵列表映射到 Cython 中的特征矩阵向量
- c# - Kerberos.Net 问题
- python - DRF 使用嵌套对象参数创建对象
- python - Pydantic .from_orm() 自动数据对话
- javascript - 使用“显示更多”按钮显示动态内容,至少可见 3 行内容
- mysql - 以降序显示艺术家拥有的专辑数量的 SQL 语法是什么
- xml - 如何在 src/test/resources 中的 xsd 中使用 /src/main/resources 中包含的 xsd
- callback - OpenAPI Swagger-UI 注释 @Callback
- c++ - 如果对象在向量中,如何从子类访问父类中函数的子类版本?