Mercurial Hosting > traffic-intelligence
diff c/feature-based-tracking.cpp @ 231:249d65ff6c35
merged modifications for windows
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Mon, 02 Jul 2012 23:49:39 -0400 |
parents | bc4ea09b1743 23da16442433 |
children | 2d34060db2e9 |
line wrap: on
line diff
--- a/c/feature-based-tracking.cpp Fri Jun 29 16:15:13 2012 -0400 +++ b/c/feature-based-tracking.cpp Mon Jul 02 23:49:39 2012 -0400 @@ -76,38 +76,19 @@ Size window = Size(params.windowSize, params.windowSize); // BruteForceMatcher<Hamming> descMatcher; - // std::vector<DMatch> matches; - Size videoSize; - - // if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) // if no parameter or number parameter - // capture.open(argc == 2 ? argv[1][0] - '0' : 0); - // else if( argc >= 2 ) - // { - // capture.open(argv[1]); - // if( capture.isOpened() ) - // videoSize = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)); - // cout << "Video " << argv[1] << - // ": width=" << videoSize.width << - // ", height=" << videoSize.height << - // ", nframes=" << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl; - // if( argc > 2 && isdigit(argv[2][0]) ) // could be used to reach first frame, dumping library messages to log file (2> /tmp/log.txt) - // { - // sscanf(argv[2], "%d", ¶ms.frame1); - // cout << "seeking to frame #" << params.frame1 << endl; - // //cap.set(CV_CAP_PROP_POS_FRAMES, pos); - // for (int i=0; i<params.frame1; i++) - // capture >> frame; - // } - // } + // vector<DMatch> matches; VideoCapture capture; + Size videoSize; + unsigned int nFrames = 0; capture.open(params.videoFilename); if(capture.isOpened()) { videoSize = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)); + nFrames = capture.get(CV_CAP_PROP_FRAME_COUNT); cout << "Video " << params.videoFilename << ": width=" << videoSize.width << ", height=" << videoSize.height << - ", nframes=" << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl; + ", nframes=" << nFrames << endl; } else { cout << "Video filename " << params.videoFilename << " could not be opened. Exiting." << endl; exit(0); @@ -145,17 +126,26 @@ int key = '?'; unsigned int savedFeatureId=0; Mat frame, currentFrameBW, previousFrameBW; - for (int frameNum = params.frame1; ((frameNum-params.frame1 < params.nFrames) || (params.nFrames < 0)) && !::interruptionKey(key); frameNum++) { + + unsigned int lastFrameNum = params.frame1+nFrames; + if (params.nFrames > 0) + lastFrameNum = MIN(params.frame1+params.nFrames, nFrames); + + capture.set(CV_CAP_PROP_POS_FRAMES, params.frame1); + for (unsigned int frameNum = params.frame1; (frameNum < lastFrameNum) && !::interruptionKey(key); frameNum++) { capture >> frame; - cout << frameNum << " " << capture.get(CV_CAP_PROP_POS_FRAMES) << " " << prevPts.size() << endl; - int emptyFrameNum = 0; - while (frame.empty()) { - cerr << "empty frame " << emptyFrameNum << " " << capture.get(CV_CAP_PROP_POS_FRAMES)<< endl; - capture >> frame;//break; - emptyFrameNum++; - if (emptyFrameNum>=3000) - exit(0); - } + if (frameNum%50 ==0) + cout << "frame " << frameNum << endl; + //capture.get(CV_CAP_PROP_POS_FRAMES) << " " << prevPts.size() << endl; + + // int emptyFrameNum = 0; + // while (frame.empty()) { + // cerr << "empty frame " << emptyFrameNum << " " << capture.get(CV_CAP_PROP_POS_FRAMES)<< endl; + // capture >> frame;//break; + // emptyFrameNum++; + // if (emptyFrameNum>=3000) + // exit(0); + // } cvtColor(frame, currentFrameBW, CV_RGB2GRAY); // "normal" feature detectors: detect features here @@ -249,8 +239,6 @@ } void groupFeatures(const KLTFeatureTrackingParameters& params) { - cout << "group" << endl; - boost::shared_ptr<TrajectoryDBAccessList<Point2f> > trajectoryDB = boost::shared_ptr<TrajectoryDBAccessList<Point2f> >(new TrajectoryDBAccessList<Point2f>()); //TODO write generic methods for blob and list versions TrajectoryDBAccess<Point2f>* trajectoryDB = new TrajectoryDBAccessBlob<Point2f>(); bool success = trajectoryDB->connect(params.databaseFilename.c_str()); @@ -272,21 +260,39 @@ // c_end = std::clock(); // cout << "Loaded " << trajectories.size() << " trajectories one by one in " << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC << " CPU seconds" << endl; - trajectoryDB->createViewInstants(); - int maxTrajectoryLength; - trajectoryDB->maxTrajectoryLength(maxTrajectoryLength); - cout << "max trajectory length " << maxTrajectoryLength << endl; - maxTrajectoryLength = 20; // for tests + trajectoryDB->createInstants("table"); + + unsigned int maxTrajectoryLength = 0; + success = trajectoryDB->maxTrajectoryLength(maxTrajectoryLength); + if (!success || maxTrajectoryLength == 0) { + cout << "problem with trajectory length " << success << endl; + exit(0); + } + cout << "Longest trajectory: " << maxTrajectoryLength << endl; FeatureGraph featureGraph(params.mmConnectionDistance, params.mmSegmentationDistance, params.minFeatureTime, params.minNFeaturesPerGroup); // main loop - // TODO version that can be interrupted? - for (int frameNum = params.frame1; ((frameNum-params.frame1 < params.nFrames) || (params.nFrames < 0)); frameNum++) { - std::vector<int> trajectoryIds; - success = trajectoryDB->trajectoryIdEndingAt(trajectoryIds, frameNum); // ending - cout << "frame " << frameNum << " " << success << endl; + unsigned int frameNum; + unsigned int firstFrameNum = -1, lastFrameNum = -1; + trajectoryDB->firstLastInstants(firstFrameNum, lastFrameNum); + firstFrameNum = MAX(firstFrameNum, params.frame1); + if (params.nFrames>0) + lastFrameNum = MIN(lastFrameNum,params.frame1+params.nFrames); + for (frameNum = firstFrameNum; frameNum<lastFrameNum; frameNum ++) { + vector<int> trajectoryIds; + success = trajectoryDB->trajectoryIdEndingAt(trajectoryIds, frameNum); + if (frameNum%100 ==0) + cout << "frame " << frameNum << endl; + //success = trajectoryDB->trajectoryIdInInterval(trajectoryIds, frameNum, min(frameNum+queryIntervalLength-1, frameNum+params.nFrames)); // ending +#if DEBUG cout << trajectoryIds.size() << " trajectories " << endl; +#endif + // vector<TrajectoryPoint2fPtr> positions, velocities; + // trajectoryDB->read(positions, trajectoryIds, "positions"); + // trajectoryDB->read(velocities, trajectoryIds, "velocities"); + // for (unsigned int i=0; i<trajectoryIds.size(); ++i) { + // FeatureTrajectoryPtr ft = FeatureTrajectoryPtr(new FeatureTrajectory(positions[i], velocities[i])); BOOST_FOREACH(int trajectoryId, trajectoryIds) { //cout << trajectoryId << " " << endl; // boost::shared_ptr<Trajectory<cv::Point2f> > trajectory; @@ -297,18 +303,27 @@ featureGraph.addFeature(ft); } - // check for connected components that are old enough (no chance to match with trajectories to be added later - // we could check only when some features are getting old enough? - if (frameNum%10 == 0) { - featureGraph.connectedComponents(frameNum-maxTrajectoryLength+params.minFeatureTime); - std::vector<vector<unsigned int> > featureGroups = featureGraph.getFeatureGroups(); + // check for connected components + int lastInstant = frameNum+params.minFeatureTime-maxTrajectoryLength; + if (lastInstant > 0 && frameNum%10==0) { + featureGraph.connectedComponents(lastInstant); + vector<vector<unsigned int> > featureGroups = featureGraph.getFeatureGroups(); for (unsigned int i=0; i<featureGroups.size(); ++i) { trajectoryDB->writeObject(savedObjectId, featureGroups[i], -1, 1, string("objects"), string("objects_features")); savedObjectId++; } } + + if (frameNum%100 ==0) + cout << featureGraph.informationString() << endl; + } - cout << featureGraph.informationString() << endl; + // save remaining objects + featureGraph.connectedComponents(frameNum+maxTrajectoryLength+1); + vector<vector<unsigned int> > featureGroups = featureGraph.getFeatureGroups(); + for (unsigned int i=0; i<featureGroups.size(); ++i) { + trajectoryDB->writeObject(savedObjectId, featureGroups[i], -1, 1, string("objects"), string("objects_features")); + savedObjectId++; } trajectoryDB->endTransaction();