comparison c/feature-based-tracking.cpp @ 138:c1b260b48d2a

corrected initialization bugs and feature shortening before saving
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 19 Aug 2011 12:15:23 -0400
parents 445e773c9be3
children 47329bd16cc0
comparison
equal deleted inserted replaced
137:445e773c9be3 138:c1b260b48d2a
108 // capture >> frame; 108 // capture >> frame;
109 // } 109 // }
110 // } 110 // }
111 111
112 capture.open(params.videoFilename); 112 capture.open(params.videoFilename);
113 if (!capture.isOpened()) 113 if(capture.isOpened()) {
114 { 114 videoSize = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT));
115 //help(argv); 115 cout << "Video " << argv[1] <<
116 cout << "capture device " << argv[1] << " failed to open!" << endl; 116 ": width=" << videoSize.width <<
117 return 1; 117 ", height=" << videoSize.height <<
118 } 118 ", nframes=" << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl;
119 } else {
120 cout << "Video filename " << params.videoFilename << " could not be opened. Exiting." << endl;
121 exit(0);
122 }
123 // if (!capture.isOpened())
124 // {
125 // //help(argv);
126 // cout << "capture device " << argv[1] << " failed to open!" << endl;
127 // return 1;
128 // }
119 129
120 // database 130 // database
121 TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessList<Point2f>(); 131 TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessList<Point2f>();
122 //TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessBlob<Point2f>(); 132 //TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessBlob<Point2f>();
123 trajectoryDB->connect("test.sqlite"); 133 trajectoryDB->connect(params.databaseFilename.c_str());
124 trajectoryDB->createTable(); 134 trajectoryDB->createTable();
125 135
126 vector<KeyPoint> prevKpts, currKpts; 136 vector<KeyPoint> prevKpts, currKpts;
127 vector<Point2f> prevPts, currPts, newPts; 137 vector<Point2f> prevPts, currPts, newPts;
128 vector<uchar> status; 138 vector<uchar> status;
156 while (iter != featurePointMatches.end()) { 166 while (iter != featurePointMatches.end()) {
157 bool deleteFeature = false; 167 bool deleteFeature = false;
158 168
159 if (status[iter->pointNum]) { 169 if (status[iter->pointNum]) {
160 iter->feature->addPoint(frameNum, currPts[iter->pointNum]); 170 iter->feature->addPoint(frameNum, currPts[iter->pointNum]);
161 trackedPts.push_back(currPts[iter->pointNum]); 171
162 iter->pointNum = trackedPts.size()-1; 172 bool smallDisplacement = iter->feature->smallDisplacement(params.nDisplacements, minTotalFeatureDisplacement);
163 173 if (smallDisplacement)
164 deleteFeature |= !iter->feature->largeDisplacement(params.nDisplacements, minTotalFeatureDisplacement); 174 iter->feature->shorten();
175 deleteFeature |= smallDisplacement;
165 // motionSmooth() 176 // motionSmooth()
166 } 177 }
167 178
168 if (deleteFeature) { 179 if (deleteFeature) {
169 if (iter->feature->length() >= params.minFeatureTime) { 180 if (iter->feature->length() >= params.minFeatureTime) {
170 iter->feature->setId(savedFeatureId); 181 iter->feature->setId(savedFeatureId);
171 savedFeatureId++; 182 savedFeatureId++;
172 iter->feature->write(*trajectoryDB); 183 iter->feature->write(*trajectoryDB);
173 } 184 }
174 iter = featurePointMatches.erase(iter); 185 iter = featurePointMatches.erase(iter);
175 } else 186 } else {
187 trackedPts.push_back(currPts[iter->pointNum]);
188 iter->pointNum = trackedPts.size()-1;
176 iter++; 189 iter++;
190 }
177 } 191 }
178 currPts = trackedPts; 192 currPts = trackedPts;
179 assert(currPts.size() == featurePointMatches.size()); 193 assert(currPts.size() == featurePointMatches.size());
180 194
181 if (params.display) 195 if (params.display)