Skip to content

Commit

Permalink
finished adding protobuf message to CVTracker class
Browse files Browse the repository at this point in the history
  • Loading branch information
BrennoCaldato committed Jun 27, 2020
1 parent fed81da commit 1ebad2c
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 57 deletions.
7 changes: 6 additions & 1 deletion include/CVTracker.h
Expand Up @@ -19,6 +19,8 @@ struct FrameData{
int y2 = -1;

// constructor
FrameData()
{}
FrameData( int _frame_id)
{frame_id = _frame_id;}

Expand All @@ -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<FrameData> trackedData;
std::map<int, FrameData> trackedDataById;
std::string trackerType;
Ptr<Tracker> tracker;
Rect2d bbox;
Expand All @@ -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);
};
35 changes: 19 additions & 16 deletions src/CVTracker.cpp
Expand Up @@ -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;
}
Expand All @@ -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;
Expand All @@ -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<int,FrameData>::iterator it=trackedDataById.begin(); it!=trackedDataById.end(); ++it){

FrameData fData = trackedData[i];
FrameData fData = it->second;
libopenshottracker::Frame* pbFrameData;
AddFrameDataToProto(trackerMessage.add_frame(), fData);
}
Expand Down Expand Up @@ -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++) {
Expand All @@ -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()) {
Expand All @@ -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];
}

}
109 changes: 69 additions & 40 deletions src/examples/Example_opencv.cpp
Expand Up @@ -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<openshot::Frame> 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 <<" "<<fd.x2<< " "<<fd.y2<<"\n";
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);
Expand All @@ -108,16 +84,69 @@ int main(int argc, char* argv[]) {
if(c==27)
break;

w9.WriteFrame(f);
}


// Save tracked data to file
std::cout << "Saving tracker data!" << std::endl;
kcfTracker.SaveTrackedData("kcf_tracker.data");
}

void displayTrackedData(openshot::FFmpegReader &r9){
// Opencv display window
cv::namedWindow("Display Image", cv::WINDOW_NORMAL );

// Create Tracker
CVTracker kcfTracker;
// Load saved data
if(!kcfTracker.LoadTrackedData("kcf_tracker.data")){
std::cout<<"Was not possible to load the tracked data\n";
return;
}

for (long int frame = 1100; frame <= 1500; frame++)
{
int frame_number = frame;
std::shared_ptr<openshot::Frame> 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();
Expand Down

0 comments on commit 1ebad2c

Please sign in to comment.