//--------------------------------------------------------------------------- bool OnlineMILAlgorithm::initialize(const cv::Mat & image, const ObjectTrackerParams& params, const CvRect& init_bounding_box) { import_image(image); ((cv::mil::ClfMilBoostParams*) clfparams_)->_numSel = params.num_classifiers_; ((cv::mil::ClfMilBoostParams*) clfparams_)->_numFeat = params.num_features_; tracker_params_._posradtrain = params.pos_radius_train_; tracker_params_._negnumtrain = params.neg_num_train_; // Tracking parameters tracker_params_._init_negnumtrain = 65; tracker_params_._init_postrainrad = 3.0f; tracker_params_._initstate[0] = (float) init_bounding_box.x; tracker_params_._initstate[1] = (float) init_bounding_box.y; tracker_params_._initstate[2] = (float) init_bounding_box.width; tracker_params_._initstate[3] = (float) init_bounding_box.height; tracker_params_._srchwinsz = 25; tracker_params_._negsamplestrat = 1; tracker_params_._initWithFace = false; tracker_params_._debugv = false; tracker_params_._disp = false; // set this to true if you want to see video output (though it slows things down) clfparams_->_ftrParams->_width = (cv::mil::uint) init_bounding_box.width; clfparams_->_ftrParams->_height = (cv::mil::uint) init_bounding_box.height; tracker_.init(image_, tracker_params_, clfparams_); // Return success is_initialized = true; return true; }
//--------------------------------------------------------------------------- bool SemiOnlineBoostingAlgorithm::update(const cv::Mat & image, const ObjectTrackerParams& params, cv::Rect & track_box) { // Import the image import_image(image); // Make sure the tracker has already been successfully initialized if (tracker_ == NULL) { std::cerr << "OnlineBoostingAlgorithm::update(...) -- ERROR! Trying to call update without properly initializing the tracker!\n" << std::endl; return false; } if (cur_frame_rep_ == NULL) { std::cerr << "OnlineBoostingAlgorithm::update(...) -- ERROR! Trying to call update without properly initializing the tracker!\n" << std::endl; return false; } // Calculate the patches within the search region cv::Size imageSize(image_.cols, image_.rows); cv::Rect wholeImage = cv::Rect(0, 0, imageSize.width, imageSize.height); boosting::Patches *trackingPatches; cv::Rect searchRegion = tracker_->getTrackingROI(params.search_factor_); trackingPatches = new boosting::PatchesRegularScan(searchRegion, wholeImage, tracking_rect_size_, params.overlap_); cur_frame_rep_->setNewImageAndROI(image_, searchRegion); if (!tracker_->track(cur_frame_rep_, trackingPatches)) { tracker_lost_ = true; } else { tracker_lost_ = false; } if(trackingPatches) delete trackingPatches; // Save the new tracking ROI track_box = tracker_->getTrackedPatch(); std::cout << "\rTracking confidence = " << tracker_->getConfidence(); // Return success or failure based on whether or not the tracker has been lost return !tracker_lost_; }
//--------------------------------------------------------------------------- bool SemiOnlineBoostingAlgorithm::initialize(const cv::Mat & image, const ObjectTrackerParams& params, const CvRect& init_bounding_box) { // Import the image import_image(image); // If the boosting tracker has already been allocated, first de-allocate it if (tracker_ != NULL) { std::cerr << "OnlineBoostingAlgorithm::initialize(...) -- WARNING! Boosting tracker already initialized. Resetting now...\n" << std::endl; if(tracker_) delete tracker_; tracker_ = NULL; } // Do the same for the image frame representation if (cur_frame_rep_ != NULL) { std::cerr << "OnlineBoostingAlgorithm::initialize(...) -- WARNING! Boosting tracker already initialized. Resetting now...\n" << std::endl; if(cur_frame_rep_) delete cur_frame_rep_; cur_frame_rep_ = NULL; } // (Re-)Initialize the boosting tracker cv::Size imageSize(image_.cols, image_.rows); cur_frame_rep_ = new boosting::ImageRepresentation(image_, imageSize); cv::Rect wholeImage = cv::Rect(0, 0, imageSize.width, imageSize.height); cv::Rect tracking_rect = init_bounding_box; tracking_rect_size_ = cv::Size(tracking_rect.width, tracking_rect.height); tracker_ = new boosting::SemiBoostingTracker(cur_frame_rep_, tracking_rect, wholeImage, params.num_classifiers_); // Initialize some useful tracking debugging information tracker_lost_ = false; // Return success return true; }
//--------------------------------------------------------------------------- bool OnlineMILAlgorithm::update(const cv::Mat & image, const ObjectTrackerParams& params, cv::Rect & track_box) { if (!is_initialized) { std::cerr << "OnlineMILAlgorithm::update() -- Error! Did not intialize algorithm!\n" << std::endl; return false; } import_image(image); // Update tracker tracker_.track_frame(image_); // Save output tracker_.getTrackBox(track_box); // Return success return true; }
int main(int argc, char *argv[]) { unsigned char *image; unsigned int w, h, i; char bpp; if (argc > 1) { /* Import RBG[A] pixmap */ if (!import_image(argv[1], &image, &w, &h, &bpp) && (image && w > 0 && h > 0 && bpp > 0)) { /* Dump ASCII PPM header */ printf("P3\n"); printf("# CREATOR Mongoose, from %s\n", argv[1]); printf("%i %i\n", w, h); printf("255\n"); /* Dump ASCII PPM image */ for (i = 0; i < w*h; i++) { printf("%i\n%i\n%i\n", image[i*bpp], image[i*bpp+1], image[i*bpp+2]); } delete [] image; } else { printf("Error loading image\n"); } } else { printf("Usage:\n\t%s image_filename > filename.ppm\n", argv[0]); } return 0; }
/* ** cg_read_conf() ** Read the configuration file. */ yerr_t cg_read_conf(cg_t *carta, const char *input, ybool_t initial) { ydom_t *dom; ydom_node_t *root_node; yvect_t array; int i; char *pt = NULL, *pt2 = NULL; if (!(dom = ydom_new())) { YLOG_ADD(YLOG_ERR, "Memory error"); return (YENOMEM); } if (ydom_read_file(dom, input) != YENOERR) { YLOG_ADD(YLOG_ERR, "Problem with file '%s'", input); ydom_del(dom); return (YEINVAL); } if (!(array = ydom_xpath(dom, "/pandocreon:carta-genius")) || !yv_len(array) || !array[0]) { YLOG_ADD(YLOG_ERR, "No configuration"); yv_del(&array, NULL, NULL); ydom_del(dom); return (YEINVAL); } root_node = array[0]; yv_del(&array, NULL, NULL); yv_add(&carta->xml_doms, dom); /* get document info */ if ((array = ydom_node_xpath(root_node, "info")) && yv_len(array) && array[0]) { carta->author = ydom_node_get_attr_value(array[0], "author"); carta->title = ydom_node_get_attr_value(array[0], "title"); carta->subject = ydom_node_get_attr_value(array[0], "subject"); carta->keywords = ydom_node_get_attr_value(array[0], "keywords"); carta->copyright = ydom_node_get_attr_value(array[0], "copyright"); carta->version = ydom_node_get_attr_value(array[0], "version"); carta->language = ydom_node_get_attr_value(array[0], "lang"); carta->note = ydom_node_get_attr_value(array[0], "note"); } yv_del(&array, NULL, NULL); /* get PDF version */ if ((array = ydom_node_xpath(root_node, "pdf")) && yv_len(array) && array[0]) { char *passwd1 = NULL, *passwd2 = NULL; pt = ydom_node_get_attr_value(array[0], "version"); passwd1 = ydom_node_get_attr_value(array[0], "master-password"); passwd2 = ydom_node_get_attr_value(array[0], "user-password"); if (!passwd1 || !passwd2 || !strcmp(passwd1, passwd2)) { free0(passwd1); free0(passwd2); } carta->master_password = passwd1; carta->user_password = passwd2; } if (pt && !strcmp(pt, "1.3")) carta->pdf_version = PDF_13; else if (pt && !strcmp(pt, "1.5")) carta->pdf_version = PDF_15; else carta->pdf_version = PDF_14; free0(pt); yv_del(&array, NULL, NULL); /* get general configuration */ if (initial) { /* get default unit */ if ((array = ydom_node_xpath(root_node, "unit")) && yv_len(array) && array[0] && (pt = ydom_node_get_attr_value(array[0], "base"))) { if (!strcasecmp(pt, "mm") || !strcasecmp(pt, "millimeter")) carta->default_unit = YUNIT_MM; else if (!strcasecmp(pt, "cm") || !strcasecmp(pt, "centimeter")) carta->default_unit = YUNIT_CM; else if (!strcasecmp(pt, "in") || !strcasecmp(pt, "inch")) carta->default_unit = YUNIT_IN; else if (!strcasecmp(pt, "pt") || !strcasecmp(pt, "point")) carta->default_unit = YUNIT_PT; else { YLOG_ADD(YLOG_ERR, "Bad default unit [line %d]", ((ydom_node_t*)array[0])->line_nbr); free0(pt); yv_del(&array, NULL, NULL); ydom_del(dom); return (YEINVAL); } free0(pt); } else { YLOG_ADD(YLOG_INFO, "No default unit. Set to mm."); carta->default_unit = YUNIT_MM; } yv_del(&array, NULL, NULL); /* get cards' back configuration */ if ((array = ydom_node_xpath(root_node, "back")) && yv_len(array) && array[0]) { if ((pt = ydom_node_get_attr_value(array[0], "side"))) { if (!strcasecmp(pt, "width")) carta->do_back = BACK_WIDTH; else if (!strcasecmp(pt, "height")) carta->do_back = BACK_HEIGHT; free0(pt); } else carta->do_back = BACK_NO; if ((pt = ydom_node_get_attr_value(array[0], "reverse")) && (!strcasecmp(pt, "yes") || !strcasecmp(pt, "true"))) carta->reverse = YTRUE; free0(pt); } else carta->do_back = BACK_NO; yv_del(&array, NULL, NULL); } /* get templates */ if ((array = ydom_node_xpath(root_node, "templates/template")) && yv_len(array)) { int i; for (i = 0; i < yv_len(array); ++i) yv_add(&carta->templates, array[i]); } yv_del(&array, NULL, NULL); /* get init variables */ if ((array = ydom_node_xpath(root_node, "variables/var")) && yv_len(array)) { int i; for (i = 0; i < yv_len(array); ++i) yv_add(&carta->variables, array[i]); } yv_del(&array, NULL, NULL); /* get default font */ if ((array = ydom_node_xpath(root_node, "fonts")) && yv_len(array) && array[0]) { char *default_font; if ((default_font = ydom_node_get_attr_value(array[0], "default"))) { free0(carta->default_font); carta->default_font = default_font; } } yv_del(&array, NULL, NULL); /* get fonts */ if ((array = ydom_node_xpath(root_node, "fonts/*")) && yv_len(array) && array[0]) { int i; for (i = 0; i < yv_len(array); ++i) { char *tag_name = ydom_node_get_name(array[i]); if (tag_name && !strcmp(tag_name, "font")) import_font(carta, array[i]); else if (tag_name && !strcmp(tag_name, "path")) { char *dir = ydom_node_get_attr_value(array[i], "dir"); if (dir && strlen(dir)) add_font_paths(carta, dir); else YLOG_ADD(YLOG_WARN, "Path without 'dir' argument [line %d].", ((ydom_node_t*)array[i])->line_nbr); free0(dir); } free0(tag_name); } } yv_del(&array, NULL, NULL); /* get images */ if ((array = ydom_node_xpath(root_node, "images/*")) && yv_len(array) && array[0]) { int i; for (i = 0; i < yv_len(array); ++i) { char *tag_name = ydom_node_get_name(array[i]); if (tag_name && !strcmp(tag_name, "image")) import_image(carta, array[i], YFALSE); else if (tag_name && !strcmp(tag_name, "mask")) import_image(carta, array[i], YTRUE); else if (tag_name && !strcmp(tag_name, "path")) { /* add a directory for path searching */ char *dir = ydom_node_get_attr_value(array[i], "dir"); if (dir && strlen(dir)) add_img_paths(carta, dir); else YLOG_ADD(YLOG_WARN, "Path without 'dir' argument [line %d].", ((ydom_node_t*)array[i])->line_nbr); free0(dir); } free0(tag_name); } } yv_del(&array, NULL, NULL); /* get all decks */ array = ydom_node_xpath(root_node, "deck"); for (i = 0; i < yv_len(array); ++i) { cg_deck_t *deck; ydom_node_t *deck_node = array[i]; yvect_t array2; deck = malloc0(sizeof(cg_deck_t)); deck->line_nbr = deck_node->line_nbr; /* get paper size */ if ((array2 = ydom_node_xpath(deck_node, "paper")) && yv_len(array2) && array2[0]) { cg_expr_var_t e_w = {0}, e_h = {0}; yvalue_t width, height, margin_w, margin_h; /* get width and height */ if ((pt = ydom_node_get_attr_value(array2[0], "type"))) { cg_paper_t paper_type = cg_get_paper(pt); width = cg_get_paper_width(paper_type); height = cg_get_paper_height(paper_type); if ((pt2 = ydom_node_get_attr_value(array2[0], "landscape")) && (!strcasecmp(pt2, "yes") || !strcasecmp(pt2, "true"))) { yvalue_t tmp_val = width; width = height; height = tmp_val; } } else if ((pt = ydom_node_get_attr_value(array2[0], "width")) && cg_expr(carta, pt, &e_w, carta->default_unit) == YENOERR && e_w.type == CG_EXPR_VALUE && (pt2 = ydom_node_get_attr_value(array2[0], "height")) && cg_expr(carta, pt2, &e_h, carta->default_unit) == YENOERR && e_h.type == CG_EXPR_VALUE) { width = e_w.value.value; height = e_h.value.value; } else { YLOG_ADD(YLOG_WARN, "No valid paper size. Set to a4."); width = cg_get_paper_width(A4); height = cg_get_paper_height(A4); } free0(pt); free0(pt2); free_var(&e_w, &e_w); free_var(&e_h, &e_h); /* get margin */ if ((pt = ydom_node_get_attr_value(array2[0], "margin"))) margin_w = margin_h = yvalue_read(pt, carta->default_unit); else margin_w = margin_h = yvalue_read(DEFAULT_MARGIN, carta->default_unit); free0(pt); if ((pt = ydom_node_get_attr_value(array2[0], "margin-width")) && cg_expr(carta, pt, &e_w, carta->default_unit) == YENOERR && e_w.type == CG_EXPR_VALUE) margin_w = e_w.value.value; free0(pt); if ((pt = ydom_node_get_attr_value(array2[0], "margin-height")) && cg_expr(carta, pt, &e_h, carta->default_unit) == YENOERR && e_h.type == CG_EXPR_VALUE) margin_h = e_h.value.value; free0(pt); free_var(&e_w, &e_w); free_var(&e_h, &e_h); deck->paper_width = width; deck->paper_height = height; deck->paper_margin_w = margin_w; deck->paper_margin_h = margin_h; } else { YLOG_ADD(YLOG_INFO, "No paper size, set to default (A4)."); deck->paper_width = cg_get_paper_width(A4); deck->paper_height = cg_get_paper_height(A4); deck->paper_margin_w = deck->paper_margin_h = yvalue_read(DEFAULT_MARGIN, carta->default_unit); } yv_del(&array2, NULL, NULL); /* get hidden ditch config */ if ((array2 = ydom_node_xpath(deck_node, "hidden-ditch")) && yv_len(array2) && array2[0]) { /* get margin */ deck->ditch_even = ydom_node_get_attr_value(array2[0], "even"); deck->ditch_odd = ydom_node_get_attr_value(array2[0], "odd"); } yv_del(&array2, NULL, NULL); /* get card size */ if ((array2 = ydom_node_xpath(deck_node, "cardsize")) && yv_len(array2) && array2[0]) { yvalue_t width, height, space_w, space_h; if ((pt = ydom_node_get_attr_value(array2[0], "type"))) { cg_paper_t paper_type = cg_get_paper(pt); width = cg_get_paper_width(paper_type); height = cg_get_paper_height(paper_type); if ((pt2 = ydom_node_get_attr_value(array2[0], "landscape")) && (!strcasecmp(pt2, "yes") || !strcasecmp(pt2, "true"))) { yvalue_t tmp_val = width; width = height; height = tmp_val; } } else if ((pt = ydom_node_get_attr_value(array2[0], "width")) && (pt2 = ydom_node_get_attr_value(array2[0], "height"))) { width = yvalue_read(pt, carta->default_unit); height = yvalue_read(pt2, carta->default_unit); } else { YLOG_ADD(YLOG_WARN, "No valid card size. Set to a6."); width = cg_get_paper_width(A6); height = cg_get_paper_height(A6); } free0(pt); free0(pt2); deck->card_width = width; deck->card_height = height; if ((pt = ydom_node_get_attr_value(array2[0], "space"))) space_w = space_h = yvalue_read(pt, carta->default_unit); else if ((pt = ydom_node_get_attr_value(array2[0], "space-width")) && (pt2 = ydom_node_get_attr_value(array2[0], "space-height"))) { space_w = yvalue_read(pt, carta->default_unit); space_h = yvalue_read(pt2, carta->default_unit); } else { space_w.unit = space_h.unit = YUNIT_PT; space_w.value = space_h.value = 0.0; } deck->space_width = space_w; deck->space_height = space_h; free0(pt); free0(pt2); } else { YLOG_ADD(YLOG_INFO, "No card size. Set to a6."); deck->card_width = cg_get_paper_width(A6); deck->card_height = cg_get_paper_height(A6); } yv_del(&array2, NULL, NULL); /* get cards */ deck->cards = ydom_node_xpath(deck_node, "card"); yv_add(&carta->decks, deck); } /* get included files */ if ((array = ydom_node_xpath(root_node, "includes/*")) && yv_len(array) && array[0]) { int i; for (i = 0; i < yv_len(array); ++i) { char *tag_name = ydom_node_get_name(array[i]); if (tag_name && !strcmp(tag_name, "include")) { /* include a file */ char *file = ydom_node_get_attr_value(array[i], "file"); if (file && strlen(file)) include_file(carta, file); else YLOG_ADD(YLOG_WARN, "Include without 'file' argument [line %d].", ((ydom_node_t*)array[i])->line_nbr); free0(file); } else if (tag_name && !strcmp(tag_name, "path")) { /* add an include dir */ char *dir = ydom_node_get_attr_value(array[i], "dir"); if (dir && strlen(dir)) add_inc_paths(carta, dir); else YLOG_ADD(YLOG_WARN, "Path without 'dir' argument [line %d].", ((ydom_node_t*)array[i])->line_nbr); free0(dir); } free0(tag_name); } } yv_del(&array, NULL, NULL); return (YENOERR); }