2016-06-17 2 views
0

Я пытаюсь вычислить Sampson distance, расстояние от точки до соответствующей эпиполярной линии, которую я буду использовать в качестве показателя ошибки позже. Я использую opencv 3.1, c++ и windows-10 visual studio 14.Sampson Distance using opencv, C++

Но функция sampsonDistance разбивает код:

Point3f point1 = Point3f(keypoints_1[good_matches[iP].queryIdx].pt.x, keypoints_1[good_matches[iP].queryIdx].pt.y, 1.0); 
Point3f point2 = Point3f(keypoints_2[good_matches[iP].trainIdx].pt.x, keypoints_2[good_matches[iP].trainIdx].pt.y, 1.0);    

Mat pt1(point1); 
Mat pt2(point2); 

double sampsonD = sampsonDistance(pt1, pt2, Flist[iF]) 

Я получаю сообщение об ошибке:

OpenCV Error: Assertion failed (_pt1.type() == CV_64F && _pt1.type() == CV_64F && _F.type() == CV_64F) in cv::sampsonDistance, file D:\opencv\sources\modules\calib3d\src\fundam.cpp, line 1043 

Документация говорит:

double cv::sampsonDistance (InputArray pt1, 
InputArray pt2, 
InputArray F 
) 

Как использовать эту функцию, Я действительно не понимаю использование входного массива, в приведенном выше я конвертирую 3d-точку в то, что я lieve - двумерные однородные координаты, хранящиеся как cv :: Mat. Фундаментальная матрица хранится в формате 3x3 cv :: Mat.

ответ

0

Из сообщения об ошибке точки и основная матрица должны быть CV_64F (двойной тип).

Для точек, это должно быть:

Point3d point1 = Point3d(keypoints_1[good_matches[iP].queryIdx].pt.x, keypoints_1[good_matches[iP].queryIdx].pt.y, 1.0); 
Point3d point2 = Point3d(keypoints_2[good_matches[iP].trainIdx].pt.x, keypoints_2[good_matches[iP].trainIdx].pt.y, 1.0); 
+0

Спасибо, что казалось, чтобы исправить это. – SKA