Вот минимальный пример вызова registerModelToScene()
, заключенного в классе cv::ppf_match_3d::ICP
модуля взносов OpenCV сопоставление поверхности :
#include <opencv2/surface_matching/icp.hpp>
#include <opencv2/surface_matching/ppf_helpers.hpp>
int main() {
/* allocate solver */
cv::ppf_match_3d::ICP iterativeClosestPoint;
/* reference vertices */
cv::Mat reference = cv::ppf_match_3d::loadPLYSimple("reference.ply", 1);
/* measured vertices */
cv::Mat measurement = cv::ppf_match_3d::loadPLYSimple("measurement.ply", 1);
/* do the magic */
double error;
cv::Matx44d transformation;
iterativeClosestPoint.registerModelToScene(reference, measurement, error, transformation);
return 0;
}
Вершины, с которыми нужно сопоставить (reference.ply
) даны в формате файла многоугольника и представляют две точки с нормалями:
ply
format ascii 1.0
element vertex 2
property float x
property float y
property float z
property float nx
property float ny
property float nz
end_header
0 0 0 0 0 1
0 1 0 0 0 1
Вершины, которые должны быть сопоставлены, даны в том же формате файла, те же две точки, повернутые на 20 °относительно оси z:
ply
format ascii 1.0
element vertex 2
property float x
property float y
property float z
property float nx
property float ny
property float nz
end_header
0 0 0 0 0 1
0.3429 0.93937 0 0 0 1
Код компилируется на GCC 8.2.0, OpenCV версии 4.0.0.
Ошибка времени выполнения:
OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(4.0.0) Error: Assertion failed (dataset.type() == CvType<ElementType>::type()) in GenericIndex, file C:/Users/maxherrman/openCV/4.0.0/modules/flann/include/opencv2/flann.hpp, line 316
При ответах.opencv.org, есть запись о том, что типы данных элементов первых двух параметров registerModelToScene()
(Mat
) должны совпадать с типами данных четвертого (Matx44d
).
Но документация гласит:
В настоящее время CV_32F является единственным поддерживаемым типом данных.
Таким образом, тип данных элементовМодель и сцена (CV_32F
) не соответствуют типу элементов в позе (double
).
Любой идентификаторили как обойти эту проблему, или я ошибся?