const Match FindBestMatch(const cv::Mat &img, const MatchTemplate &templ, const int match_method) { const cv::Mat result = doMatch(img, templ, match_method, 0); // Localize the best match with minMaxLoc double minVal, maxVal; cv::Point minLoc, maxLoc; cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc); // For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better cv::Point matchLoc = (match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED) ? minLoc : maxLoc; double matchVal = (match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED) ? minVal : maxVal; int x = matchLoc.x; int y = matchLoc.y; /* cv::Mat chan; img.copyTo(chan); cv::Mat sq(img.rows, img.cols, img.type(), 0.0); cv::Mat sub = sq(cv::Rect2i(x, y, templ.image.cols, templ.image.rows)); //cv::rectangle(sub, cv::Rect2i(0, 0, 10, 10), cv::Scalar(255)); templ.image.copyTo(sub); cv::Mat in[] = {sq, chan, chan}; cv::Mat out; cv::merge(in, 3, out); cv::imwrite("matchbox.png", out);*/ return Match(x, y, matchVal); }
GuiDelimiter::GuiDelimiter(GuiView & lv) : GuiDialog(lv, "mathdelimiter", qt_("Math Delimiter")) { setupUi(this); connect(closePB, SIGNAL(clicked()), this, SLOT(accept())); setFocusProxy(leftLW); leftLW->setViewMode(QListView::IconMode); rightLW->setViewMode(QListView::IconMode); leftLW->setDragDropMode(QAbstractItemView::NoDragDrop); rightLW->setDragDropMode(QAbstractItemView::NoDragDrop); initMathSymbols(); typedef map<char_type, QListWidgetItem *> ListItems; ListItems list_items; // The last element is the empty one. int const end = nr_latex_delimiters - 1; for (int i = 0; i < end; ++i) { string const delim = latex_delimiters[i]; MathSymbol const & ms = mathSymbol(delim); QString symbol(ms.fontcode? QChar(ms.fontcode) : toqstr(docstring(1, ms.unicode))); QListWidgetItem * lwi = new QListWidgetItem(symbol); lwi->setToolTip(toqstr(delim)); FontInfo lyxfont; lyxfont.setFamily(ms.fontfamily); lwi->setFont(frontend::getFont(lyxfont)); list_items[ms.unicode] = lwi; leftLW->addItem(lwi); } for (int i = 0; i != leftLW->count(); ++i) { MathSymbol const & ms = mathSymbol( fromqstr(leftLW->item(i)->toolTip())); rightLW->addItem(list_items[doMatch(ms.unicode)]->clone()); } // The last element is the empty one. leftLW->addItem(qt_("(None)")); rightLW->addItem(qt_("(None)")); sizeCO->addItem(qt_("Variable")); for (int i = 0; *biggui[i]; ++i) sizeCO->addItem(qt_(biggui[i])); on_leftLW_currentRowChanged(0); bc().setPolicy(ButtonPolicy::IgnorantPolicy); }
const std::list<Match> FindAllMatches(const cv::Mat &img, const MatchTemplate &templ, int match_method, double threshold) { cv::Mat result = doMatch(img, templ, match_method); // FIXME for performance - make method of some object with lifetime linked to BattleField, overallocate and reuse std::list<Match> matches; for(int i = 0; i < 100; i++) // end condition is the threshold check; 100 in case of stupid threshold { double minVal, maxVal; cv::Point minLoc, maxLoc; cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc); // For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better double matchVal = (match_method==CV_TM_SQDIFF || match_method==CV_TM_SQDIFF_NORMED) ? minVal : maxVal; if (((match_method==CV_TM_SQDIFF || match_method==CV_TM_SQDIFF_NORMED) && matchVal > threshold) || (match_method!=CV_TM_SQDIFF && match_method!=CV_TM_SQDIFF_NORMED && matchVal < threshold) ) { break; } cv::Point matchLoc = (match_method==CV_TM_SQDIFF || match_method==CV_TM_SQDIFF_NORMED) ? minLoc : maxLoc; // FIXME: maybe useful but doesn't belong here. Fill haystack with pure green so we don't match this same location //cv::rectangle(img, matchLoc, cv::Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), // CV_RGB(0,255,0), 2); // Fill results array with hi or lo vals, so we don't match this same location cv::Scalar fillVal = (match_method==CV_TM_SQDIFF || match_method==CV_TM_SQDIFF_NORMED) ? 1 : 0; cv::floodFill(result, matchLoc, fillVal, 0, cv::Scalar(0.1), cv::Scalar(1.0)); // Add matched location to the vector //matches[count].x = matchLoc.x + templ.cols/2; // for midpoint //matches[count].y = matchLoc.y + templ.rows/2; matches.push_back(Match(matchLoc.x, matchLoc.y, matchVal)); } return matches; }