Mercurial Hosting > traffic-intelligence
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) |