ilabLoweSiftComp.C
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "Image/Image.H"
00040 #include "Image/Pixels.H"
00041 #include "SIFT/ScaleSpace.H"
00042 #include "SIFT/VisualObject.H"
00043 #include "SIFT/Keypoint.H"
00044 #include "Util/MathFunctions.H"
00045 #include "Raster/Raster.H"
00046 #include <stdlib.h>
00047 #include <stdio.h>
00048 #define USECOLOR true
00049 #define TMPKEYFILE "/tmp/loweSift.key"
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 std::vector< rutz::shared_ptr<Keypoint> >& ReadKeys(const char *filename)
00064 {
00065
00066 int i, j, num, len, val;
00067 FILE *fp = fopen(filename, "r");
00068 if (!fp)
00069 LFATAL("Can not open %s", filename);
00070
00071 std::vector< rutz::shared_ptr<Keypoint> > *keypoints = new std::vector< rutz::shared_ptr<Keypoint> >();
00072
00073 if (fscanf(fp, "%d %d", &num, &len) != 2)
00074 LFATAL("Invalid keypoint file beginning.");
00075
00076 if (len != 128)
00077 LFATAL("Keypoint descriptor length invalid (should be 128).");
00078
00079 for (i = 0; i < num; i++) {
00080
00081 float x, y, s, o;
00082 if (fscanf(fp, "%f %f %f %f", &y, &x, &s, &o) != 4)
00083 LFATAL("Invalid keypoint file format.");
00084
00085 std::vector<byte> fv;
00086
00087 for (j = 0; j < len; j++) {
00088 if (fscanf(fp, "%d", &val) != 1 || val < 0 || val > 255)
00089 LFATAL("Invalid keypoint file value.");
00090 fv.push_back((byte)val);
00091 }
00092
00093
00094 rutz::shared_ptr<Keypoint> newkey(new Keypoint(fv, x, y, s, o, 0));
00095 keypoints->push_back(newkey);
00096 }
00097
00098 return *keypoints;
00099 }
00100
00101
00102
00103 int main(const int argc, const char **argv)
00104 {
00105
00106 if (argc < 3)
00107 LFATAL("Usage: ilabSift <lowe's sift code> <image filename> ");
00108
00109
00110
00111 char cmd[255];
00112 sprintf(cmd, "%s < %s > %s", argv[1], argv[2], TMPKEYFILE);
00113 if (system(cmd) == -1)
00114 LFATAL("Can not run %s", cmd);
00115
00116 std::vector< rutz::shared_ptr<Keypoint> > loweKeypoints = ReadKeys(TMPKEYFILE);
00117 LINFO("Lowe SIFT found: %"ZU" keypoints", loweKeypoints.size());
00118
00119
00120
00121 Image< PixRGB<byte> > input = Raster::ReadRGB(argv[2]);
00122 rutz::shared_ptr<VisualObject>
00123 vo(new VisualObject("Test", "test", input,
00124 Point2D<int>(-1,-1),
00125 std::vector<float>(),
00126 std::vector< rutz::shared_ptr<Keypoint> >(),
00127 USECOLOR));
00128 std::vector< rutz::shared_ptr<Keypoint> > ilabKeypoints = vo->getKeypoints();
00129
00130 LINFO("Ilab SIFT found: %"ZU" keypoints", ilabKeypoints.size());
00131
00132
00133
00134
00135
00136 int numKeyDiff = 0;
00137 int numFvDiff = 0;
00138 for(unsigned int i=0; i<loweKeypoints.size(); i++){
00139 float lowe_x = loweKeypoints[i]->getX();
00140 float lowe_y = loweKeypoints[i]->getY();
00141 float lowe_s = loweKeypoints[i]->getS();
00142 float lowe_o = loweKeypoints[i]->getO() * -1;
00143
00144
00145 double minDist = 9999;
00146 int minMatch = -1;
00147 for (unsigned int j=0; j<ilabKeypoints.size(); j++){
00148 float ilab_x = ilabKeypoints[j]->getX();
00149 float ilab_y = ilabKeypoints[j]->getY();
00150 float ilab_s = ilabKeypoints[j]->getS();
00151 float ilab_o = ilabKeypoints[j]->getO();
00152
00153 double dist = sqrt(squareOf(ilab_x - lowe_x) +
00154 squareOf(ilab_y - lowe_y) +
00155 squareOf(ilab_s - lowe_s) +
00156 squareOf(ilab_o - lowe_o) );
00157 if (dist < minDist){
00158 minDist = dist;
00159 minMatch = j;
00160 }
00161 }
00162
00163 float fvDist = sqrt(loweKeypoints[i]->distSquared(ilabKeypoints[minMatch]));
00164
00165 if (minDist > 1) numKeyDiff++;
00166 if (fvDist > 500) numFvDiff++;
00167
00168
00169
00170
00171
00172
00173 }
00174 LINFO("Number of diffrent keypoints %i", numKeyDiff);
00175 LINFO("Number of diffrent Feature Vectors %i", numFvDiff);
00176
00177
00178 }
00179