21 #include <yarp/sig/Image.h>
22 #include <yarp/os/BufferedPort.h>
23 #include <yarp/os/RFModule.h>
24 #include <yarp/os/Network.h>
25 #include <yarp/os/Time.h>
26 #include <yarp/os/Stamp.h>
30 #include <iCub/stereoVision/utils.h>
37 Utilities::Utilities()
42 Utilities::~Utilities()
46 void Utilities::initSIFT_GPU()
48 SiftGPU* (*pCreateNewSiftGPU)(int) = NULL;
49 SiftMatchGPU* (*pCreateNewSiftMatchGPU)(int) = NULL;
52 pPath = getenv (
"SIFTGPU_DIR");
53 printf (
"\n\nThe current path is: %s\n\n",pPath);
55 std::string str = pPath;
56 str.append(
"/bin/libsiftgpu.so");
57 hsiftgpu = dlopen(str.c_str(), RTLD_LAZY);
59 pCreateNewSiftGPU = (SiftGPU* (*) (
int)) GET_MYPROC(hsiftgpu,
"CreateNewSiftGPU");
60 pCreateNewSiftMatchGPU = (SiftMatchGPU* (*)(
int)) GET_MYPROC(hsiftgpu,
"CreateNewSiftMatchGPU");
61 sift = pCreateNewSiftGPU(1);
62 matcher = pCreateNewSiftMatchGPU(4096);
65 char * argv[] = {(
char*)
"-fo", (
char*)
"-1", (
char*)
"-v",(
char*)
"1", (
char*)
"-winpos",(
char*)
"-maxd", (
char*)
"1024", (
char*)
"-cuda"};
66 int argc =
sizeof(argv)/
sizeof(
char*);
68 sift->ParseParam(argc, argv);
72 if(sift->CreateContextGL() != SiftGPU::SIFTGPU_FULL_SUPPORTED)
73 fprintf(stdout,
"boh, some error\n");
75 matcher->VerifyContextGL();
80 void Utilities::extractMatch_GPU(Mat &leftMat, Mat &rightMat, Mat &matMatches,
83 sift->RunSIFT( leftMat.cols, leftMat.rows, leftMat.data, GL_RGB, GL_UNSIGNED_BYTE );
84 num1 = sift->GetFeatureNum();
85 keys1.resize(num1); descriptors1.resize(128*num1);
86 sift->GetFeatureVector(&keys1[0], &descriptors1[0]);
88 sift->RunSIFT( rightMat.cols, rightMat.rows, rightMat.data, GL_RGB, GL_UNSIGNED_BYTE );
89 num2 = sift->GetFeatureNum();
90 keys2.resize(num2); descriptors2.resize(128*num2);
91 sift->GetFeatureVector(&keys2[0], &descriptors2[0]);
93 matcher->SetDescriptors(0, num1, &descriptors1[0]);
94 matcher->SetDescriptors(1, num2, &descriptors2[0]);
96 int (*match_buf)[2] =
new int[num1][2];
97 int num_match = matcher->GetSiftMatch(num1, match_buf);
103 for (
int i=0; i<num_match; i++)
105 SiftGPU::SiftKeypoint & key1 = keys1[match_buf[i][0]];
106 SiftGPU::SiftKeypoint & key2 = keys2[match_buf[i][1]];
108 if (fabs(key1.y-key2.y)<displacement)
112 circle(matMatches,cvPoint(x,y),2,cvScalar(255,0,0),2);
114 double x2=leftMat.cols+key2.x;
116 circle(matMatches,cvPoint(x2,y2),2,cvScalar(255,0,0),2);
117 line(matMatches, cvPoint(x,y),cvPoint(x2,y2),cvScalar(255,255,255));
120 Point2f p2(x2-leftMat.cols,y2);
122 pointsL.push_back(p1);
123 pointsR.push_back(p2);
129 void Utilities::extractMatch_GPU(Mat &leftMat, Mat &rightMat,
double displacement)
131 sift->RunSIFT( leftMat.cols, leftMat.rows, leftMat.data, GL_RGB, GL_UNSIGNED_BYTE );
132 num1 = sift->GetFeatureNum();
133 keys1.resize(num1); descriptors1.resize(128*num1);
134 sift->GetFeatureVector(&keys1[0], &descriptors1[0]);
136 sift->RunSIFT( rightMat.cols, rightMat.rows, rightMat.data, GL_RGB, GL_UNSIGNED_BYTE );
137 num2 = sift->GetFeatureNum();
138 keys2.resize(num2); descriptors2.resize(128*num2);
139 sift->GetFeatureVector(&keys2[0], &descriptors2[0]);
141 matcher->SetDescriptors(0, num1, &descriptors1[0]);
142 matcher->SetDescriptors(1, num2, &descriptors2[0]);
144 int (*match_buf)[2] =
new int[num1][2];
145 int num_match = matcher->GetSiftMatch(num1, match_buf);
151 for(
int i = 0; i < num_match; ++i)
153 SiftGPU::SiftKeypoint & key1 = keys1[match_buf[i][0]];
154 SiftGPU::SiftKeypoint & key2 = keys2[match_buf[i][1]];
156 if(fabs(key1.y-key2.y)<displacement)
161 double x2=leftMat.cols+key2.x;
165 Point2f p2(x2-leftMat.cols,y2);
167 pointsL.push_back(p1);
168 pointsR.push_back(p2);
173 void Utilities::getMatches(std::vector<cv::Point2f> & points1, std::vector<cv::Point2f> & points2)
180 void Utilities::writeSIFTs(std::string filePath, std::vector<float> &des, std::vector<SiftGPU::SiftKeypoint> &points)
186 infile.open (filePath.c_str());
189 for (
int i=0; i<points.size(); i++)
191 infile << points[i].x <<
" " << points[i].y <<
" ";
192 for (
int k=0; k<128; k++)
194 infile << des[cnt] <<
" ";
204 void Utilities::writeMatch(std::string filePath,std::vector<cv::Point2f> &pointsL, std::vector<cv::Point2f> &pointsR)
210 infile.open (filePath.c_str());
213 for (
int i=0; i<pointsL.size(); i++)
215 infile << pointsL[i].x <<
" " << pointsL[i].y <<
" " << pointsR[i].x <<
" " << pointsR[i].y ;