diff --git a/include/CVTracker.h b/include/CVTracker.h index 2b9e4fa4d..76665e5a3 100644 --- a/include/CVTracker.h +++ b/include/CVTracker.h @@ -19,6 +19,8 @@ struct FrameData{ int y2 = -1; // constructor + FrameData() + {} FrameData( int _frame_id) {frame_id = _frame_id;} @@ -38,7 +40,7 @@ class CVTracker { // List of tracker types in OpenCV std::string trackerTypes[8] = {"BOOSTING", "MIL", "KCF", "TLD","MEDIANFLOW", "GOTURN", "MOSSE", "CSRT"}; - std::vector trackedData; + std::map trackedDataById; std::string trackerType; Ptr tracker; Rect2d bbox; @@ -54,4 +56,7 @@ class CVTracker { // Load protobuf file bool LoadTrackedData(std::string inputFilePath); + + // Get tracked data for a given frame + FrameData GetTrackedData(int frameId); }; diff --git a/src/CVTracker.cpp b/src/CVTracker.cpp index 310336fba..92c6955ba 100644 --- a/src/CVTracker.cpp +++ b/src/CVTracker.cpp @@ -47,7 +47,7 @@ bool CVTracker::initTracker(Rect2d initial_bbox, Mat &frame, int frameId){ tracker->init(frame, bbox); // Add new frame data - trackedData.push_back(FrameData(frameId, 0, bbox.x, bbox.y, bbox.x+bbox.width, bbox.y+bbox.height)); + trackedDataById[frameId] = FrameData(frameId, 0, bbox.x, bbox.y, bbox.x+bbox.width, bbox.y+bbox.height); return true; } @@ -58,21 +58,13 @@ bool CVTracker::trackFrame(Mat &frame, int frameId){ if (ok) { - // Tracking success : Draw the tracked object - rectangle(frame, bbox, Scalar( 255, 0, 0 ), 2, 1 ); - // Add new frame data - trackedData.push_back(FrameData(frameId, 0, bbox.x, bbox.y, bbox.x+bbox.width, bbox.y+bbox.height)); - + trackedDataById[frameId] = FrameData(frameId, 0, bbox.x, bbox.y, bbox.x+bbox.width, bbox.y+bbox.height); } else { - // Tracking failure detected. - putText(frame, "Tracking failure detected", Point(100,80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0,0,255),2); - // Add new frame data - trackedData.push_back(FrameData(frameId)); - + trackedDataById[frameId] = FrameData(frameId); } return ok; @@ -83,9 +75,9 @@ bool CVTracker::SaveTrackedData(std::string outputFilePath){ libopenshottracker::Tracker trackerMessage; // Add all frames data - for(int i=0; i < trackedData.size(); i++){ + for(std::map::iterator it=trackedDataById.begin(); it!=trackedDataById.end(); ++it){ - FrameData fData = trackedData[i]; + FrameData fData = it->second; libopenshottracker::Frame* pbFrameData; AddFrameDataToProto(trackerMessage.add_frame(), fData); } @@ -138,8 +130,7 @@ bool CVTracker::LoadTrackedData(std::string inputFilePath){ } // Make sure the trackedData is empty - trackedData.clear(); - trackedData.reserve(trackerMessage.frame_size()); + trackedDataById.clear(); // Iterate over all frames of the saved message for (int i = 0; i < trackerMessage.frame_size(); i++) { @@ -154,7 +145,7 @@ bool CVTracker::LoadTrackedData(std::string inputFilePath){ int x2 = box.x2(); int y2 = box.y2(); - trackedData[i] = FrameData(id, rotation, x1, y1, x2, y2); + trackedDataById[id] = FrameData(id, rotation, x1, y1, x2, y2); } if (trackerMessage.has_last_updated()) { @@ -166,3 +157,15 @@ bool CVTracker::LoadTrackedData(std::string inputFilePath){ return true; } + +FrameData CVTracker::GetTrackedData(int frameId){ + + if ( trackedDataById.find(frameId) == trackedDataById.end() ) { + + return FrameData(); + } else { + + return trackedDataById[frameId]; + } + +} diff --git a/src/examples/Example_opencv.cpp b/src/examples/Example_opencv.cpp index db3ea5834..866fc07d9 100644 --- a/src/examples/Example_opencv.cpp +++ b/src/examples/Example_opencv.cpp @@ -43,63 +43,39 @@ using namespace openshot; using namespace cv; -int main(int argc, char* argv[]) { - - openshot::Settings *s = openshot::Settings::Instance(); - s->HARDWARE_DECODER = 2; // 1 VA-API, 2 NVDEC, 6 VDPAU - s->HW_DE_DEVICE_SET = 0; - - std::string input_filepath = TEST_MEDIA_PATH; - input_filepath += "Boneyard Memories.mp4"; - openshot::FFmpegReader r9(input_filepath); - r9.Open(); - r9.DisplayInfo(); - - /* WRITER ---------------- */ - openshot::FFmpegWriter w9("metadata.mp4"); - - // Set options - w9.SetAudioOptions(true, "libmp3lame", r9.info.sample_rate, r9.info.channels, r9.info.channel_layout, 128000); - w9.SetVideoOptions(true, "libx264", r9.info.fps, 1024, 576, openshot::Fraction(1,1), false, false, 3000000); - - w9.info.metadata["title"] = "testtest"; - w9.info.metadata["artist"] = "aaa"; - w9.info.metadata["album"] = "bbb"; - w9.info.metadata["year"] = "2015"; - w9.info.metadata["description"] = "ddd"; - w9.info.metadata["comment"] = "eee"; - w9.info.metadata["comment"] = "comment"; - w9.info.metadata["copyright"] = "copyright OpenShot!"; - - // Open writer - w9.Open(); - // opencv display window +void trackVideo(openshot::FFmpegReader &r9){ + // Opencv display window cv::namedWindow("Display Image", cv::WINDOW_NORMAL ); - + // Create Tracker CVTracker kcfTracker; bool trackerInit = false; - for (long int frame = 1100; frame <= 1500; frame++) { - //int frame_number = (rand() % 750) + 1; int frame_number = frame; std::shared_ptr f = r9.GetFrame(frame_number); - // convert to opencv image + // Grab Mat image cv::Mat cvimage = f->GetImageCV(); cvtColor(cvimage, cvimage, CV_RGB2BGR); - if(!trackerInit){ Rect2d bbox = selectROI("Display Image", cvimage); kcfTracker.initTracker(bbox, cvimage, frame_number); + rectangle(cvimage, bbox, Scalar( 255, 0, 0 ), 2, 1 ); + trackerInit = true; } else{ trackerInit = kcfTracker.trackFrame(cvimage, frame_number); + + // Draw box on image + FrameData fd = kcfTracker.GetTrackedData(frame_number); + // std::cout<< "fd: "<< fd.x1<< " "<< fd.y1 <<" "< f = r9.GetFrame(frame_number); + + // Grab Mat image + cv::Mat cvimage = f->GetImageCV(); + cvtColor(cvimage, cvimage, CV_RGB2BGR); + + FrameData fd = kcfTracker.GetTrackedData(frame_number); + Rect2d box(fd.x1, fd.y1, fd.x2-fd.x1, fd.y2-fd.y1); + rectangle(cvimage, box, Scalar( 255, 0, 0 ), 2, 1 ); + + cv::imshow("Display Image", cvimage); + // Press ESC on keyboard to exit + char c=(char)waitKey(25); + if(c==27) + break; + } + +} + + + +int main(int argc, char* argv[]) { + + bool LOAD_TRACKED_DATA = true; + + openshot::Settings *s = openshot::Settings::Instance(); + s->HARDWARE_DECODER = 2; // 1 VA-API, 2 NVDEC, 6 VDPAU + s->HW_DE_DEVICE_SET = 0; + + std::string input_filepath = TEST_MEDIA_PATH; + input_filepath += "Boneyard Memories.mp4"; + + openshot::FFmpegReader r9(input_filepath); + r9.Open(); + r9.DisplayInfo(); - // Close writer & reader - w9.Close(); + if(!LOAD_TRACKED_DATA) + trackVideo(r9); + else + displayTrackedData(r9); + // Close timeline r9.Close();