2016-06-17 12 views
0

Ich versuche, Sampson distance, die Entfernung von einem Punkt zu seiner entsprechenden Epipolarlinie zu berechnen, die ich später als eine Fehlermetrik verwenden werde. Ich verwende opencv 3.1, c++ und windows-10 visual studio 14.Sampson Entfernung mit opencv, C++

Aber die Funktion sampsonDistance stürzt den Code:

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]) 

ich die Fehlermeldung:

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 

Die Dokumentation sagt:

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

Wie ich diese Funktion nicht verwenden, Ich verstehe die Verwendung des Input-Arrays nicht wirklich, im obigen konvertiere ich einen 3D-Punkt in das, was ich bin Lieve ist 2D homogene Koordinaten als cv :: Mat gespeichert. Die Grundmatrix wird bei 3x3 cv :: Mat gespeichert.

Antwort

0

Aus der Fehlermeldung müssen die Punkte und die Grundmatrix CV_64F (double type) sein.

Für die Punkte, sollte es sein:

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

Dank, die es zu beheben schien. – SKA