X-Git-Url: http://rtime.felk.cvut.cz/gitweb/hercules2020/kcf.git/blobdiff_plain/6ff88d9359cb5a22c832ec28e5a01f03914375ed..a256efa16eea5cb50e28efaefae29182657e8541:/main_vot.cpp diff --git a/main_vot.cpp b/main_vot.cpp index 53d2ca6..fe5fb78 100644 --- a/main_vot.cpp +++ b/main_vot.cpp @@ -35,23 +35,25 @@ double calcAccuracy(std::string line, cv::Rect bb_rect, cv::Rect &groundtruth_re int main(int argc, char *argv[]) { //load region, images and prepare for output - std::string region, images, output; + std::string region, images, output, video_out; int visualize_delay = -1, fit_size_x = -1, fit_size_y = -1; KCF_Tracker tracker; + cv::VideoWriter videoWriter; while (1) { int option_index = 0; static struct option long_options[] = { {"debug", no_argument, 0, 'd' }, - {"visualDebug", no_argument, 0, 'p'}, + {"visual_debug", optional_argument, 0, 'p'}, {"help", no_argument, 0, 'h' }, {"output", required_argument, 0, 'o' }, + {"video_out", optional_argument, 0, 'O' }, {"visualize", optional_argument, 0, 'v' }, {"fit", optional_argument, 0, 'f' }, {0, 0, 0, 0 } }; - int c = getopt_long(argc, argv, "dphv::f::o:", long_options, &option_index); + int c = getopt_long(argc, argv, "dp::hv::f::o:O::", long_options, &option_index); if (c == -1) break; @@ -60,8 +62,14 @@ int main(int argc, char *argv[]) tracker.m_debug = true; break; case 'p': - tracker.m_visual_debug = true; - visualize_delay = 500; + if (!optarg || *optarg == 'p') + tracker.m_visual_debug = KCF_Tracker::vd::PATCH; + else if (optarg && *optarg == 'r') + tracker.m_visual_debug = KCF_Tracker::vd::RESPONSE; + else { + fprintf(stderr, "Unknown visual debug mode: %c", *optarg); + return 1; + } break; case 'h': std::cerr << "Usage: \n" @@ -69,15 +77,19 @@ int main(int argc, char *argv[]) << argv[0] << " [options] \n" << argv[0] << " [options] [path/to/output.txt]\n" << "Options:\n" - << " --visualize | -v[delay_ms]\n" - << " --output | -o \n" - << " --debug | -d\n" - << " --fit | -f[W[xH]]\n"; + << " --visualize | -v[delay_ms]\n" + << " --output | -o \n" + << " --fit | -f[W[xH]]\n" + << " --debug | -d\n" + << " --visual_debug | -p [p|r]\n"; exit(0); break; case 'o': output = optarg; break; + case 'O': + video_out = optarg ? optarg : "./output.avi"; + break; case 'v': visualize_delay = optarg ? atol(optarg) : 1; break; @@ -143,8 +155,15 @@ int main(int argc, char *argv[]) vot_io.outputBoundingBox(init_rect); vot_io.getNextImage(image); + if (!video_out.empty()) { + int codec = CV_FOURCC('M', 'J', 'P', 'G'); // select desired codec (must be available at runtime) + double fps = 25.0; // framerate of the created video stream + videoWriter.open(video_out, codec, fps, image.size(), true); + } + tracker.init(image, init_rect, fit_size_x, fit_size_y); + BBox_c bb; cv::Rect bb_rect; double avg_time = 0., sum_accuracy = 0.; @@ -179,7 +198,7 @@ int main(int argc, char *argv[]) std::cout << std::endl; - if (visualize_delay >= 0) { + if (visualize_delay >= 0 || !video_out.empty()) { cv::Point pt(bb.cx, bb.cy); cv::Size size(bb.w, bb.h); cv::RotatedRect rotatedRectangle(pt, size, bb.a); @@ -189,12 +208,15 @@ int main(int argc, char *argv[]) for (int i = 0; i < 4; i++) cv::line(image, vertices[i], vertices[(i + 1) % 4], cv::Scalar(0, 255, 0), 2); - cv::imshow("KCF output", image); - int ret = cv::waitKey(visualize_delay); - if ((visualize_delay > 0 && ret != -1 && ret < 128) || - (visualize_delay == 0 && (ret == 27 /*esc*/ || ret == 'q'))) - break; - + if (visualize_delay >= 0) { + cv::imshow("KCF output", image); + int ret = cv::waitKey(visualize_delay); + if ((visualize_delay > 0 && ret != -1 && ret < 128) || + (visualize_delay == 0 && (ret == 27 /*esc*/ || ret == 'q'))) + break; + } + if (!video_out.empty()) + videoWriter << image; } // std::stringstream s; @@ -223,6 +245,8 @@ int main(int argc, char *argv[]) std::cout << "; Average accuracy: " << sum_accuracy/frames << std::endl; groundtruth_stream.close(); } + if (!video_out.empty()) + videoWriter.release(); std::cout << std::endl; return EXIT_SUCCESS;