Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include "CvHomography.h"
00009
00010 #include "Architecture/Config/Config.h"
00011
00012 #include <math.h>
00013 #include <cv.h>
00014
00015 #define THIS CvHomography
00016
00017 using namespace std;
00018
00019 THIS::THIS ( vector< KeyPoint >* keyPoints1, vector< KeyPoint >* keyPoints2, std::list< KeyPointMatch >& matches )
00020 {
00021 m_KeyPoints1 = keyPoints1;
00022 m_KeyPoints2 = keyPoints2;
00023 m_Matches = matches;
00024 m_Success = false;
00025 m_MaxReprojectionError = Config::getFloat( "ObjectRecognition.Ransac.fMaxReprojectionError" );
00026 }
00027
00028 THIS::~THIS()
00029 {
00030 }
00031
00032 bool THIS::computeHomography()
00033 {
00034 double homMat[9];
00035 CvMat homMatCv;
00036
00037 memset ( homMat, 0, 9*sizeof ( double ) );
00038 homMatCv = cvMat ( 3, 3, CV_64F, homMat );
00039
00040 std::vector<CvPoint2D32f> points1Cv, points2Cv;
00041 CvMat points1CvMat, points2CvMat;
00042
00043 int numMatches = m_Matches.size();
00044
00045 if ( numMatches < 4 )
00046 {
00047 return false;
00048 }
00049
00050
00051 points1Cv.resize ( numMatches );
00052 points2Cv.resize ( numMatches );
00053
00054
00055 std::list<KeyPointMatch>::iterator currentMatch = m_Matches.begin();
00056 int i = 0;
00057 while ( currentMatch != m_Matches.end() )
00058 {
00059 points1Cv[i] = cvPoint2D32f ( ( *m_KeyPoints1 ) [ currentMatch->index1 ].x,
00060 ( *m_KeyPoints1 ) [ currentMatch->index1 ].y );
00061 points2Cv[i] = cvPoint2D32f ( ( *m_KeyPoints2 ) [ currentMatch->index2 ].x,
00062 ( *m_KeyPoints2 ) [ currentMatch->index2 ].y );
00063 currentMatch++;
00064 i++;
00065 }
00066
00067 points1CvMat = cvMat ( 1, numMatches, CV_32FC2, &points1Cv[0] );
00068 points2CvMat = cvMat ( 1, numMatches, CV_32FC2, &points2Cv[0] );
00069
00070
00071
00072
00073
00074
00075
00076 int method = 0;
00077 switch (Config::getInstance()->getInt( "ObjectRecognition.Homography.iMethod" ))
00078 {
00079 case 0 :
00080 method = 0;
00081 break;
00082 case 1 :
00083 method = CV_RANSAC;
00084 break;
00085 case 2 :
00086 method = CV_LMEDS;
00087 break;
00088 default:
00089 ROS_ERROR_STREAM("Undefined methode to find homography");
00090 break;
00091 }
00092
00093 m_Success = cvFindHomography( &points2CvMat, &points1CvMat, &homMatCv, method, m_MaxReprojectionError );
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 m_Homography = Homography( homMat );
00114
00115 return m_Success;
00116 }
00117
00118 void THIS::eliminateBadMatches()
00119 {
00120 vector<Point2D> points2;
00121 vector<Point2D> projPoints;
00122
00123 points2.reserve( m_Matches.size() );
00124
00125 std::list<KeyPointMatch>::iterator currentMatch = m_Matches.begin();
00126 while ( currentMatch != m_Matches.end() )
00127 {
00128 Point2D pos2 = ( *m_KeyPoints2 ) [ currentMatch->index2 ].position();
00129 points2.push_back( pos2 );
00130 currentMatch++;
00131 }
00132
00133 m_Homography.transform( points2, projPoints );
00134
00135 currentMatch = m_Matches.begin();
00136 int i = 0;
00137 while ( currentMatch != m_Matches.end() )
00138 {
00139 Point2D pos1 = ( *m_KeyPoints1 ) [ currentMatch->index1 ].position();
00140 float scale = ( *m_KeyPoints1 ) [ currentMatch->index1 ].scale;
00141 if ( pos1.distance( projPoints[i] ) > m_MaxReprojectionError*scale )
00142 {
00143 currentMatch = m_Matches.erase( currentMatch );
00144 }
00145 else
00146 {
00147 currentMatch++;
00148 }
00149 i++;
00150 }
00151 }
00152
00153 #undef THIS