void FeaturesMatcher::operator ()(const vector<ImageFeatures> &features, vector<MatchesInfo> &pairwise_matches, const Mat &mask) { const int num_images = static_cast<int>(features.size()); CV_Assert(mask.empty() || (mask.type() == CV_8U && mask.cols == num_images && mask.rows)); Mat_<uchar> mask_(mask); if (mask_.empty()) mask_ = Mat::ones(num_images, num_images, CV_8U); vector<pair<int,int> > near_pairs; for (int i = 0; i < num_images - 1; ++i) for (int j = i + 1; j < num_images; ++j) if (features[i].keypoints.size() > 0 && features[j].keypoints.size() > 0 && mask_(i, j)) near_pairs.push_back(make_pair(i, j)); pairwise_matches.resize(num_images * num_images); MatchPairsBody body(*this, features, pairwise_matches, near_pairs); if (is_thread_safe_) parallel_for(BlockedRange(0, static_cast<int>(near_pairs.size())), body); else body(BlockedRange(0, static_cast<int>(near_pairs.size()))); LOGLN_CHAT(""); }
/* Private helper method to transfer pixels from designated rectangle to * Grabcut mask. */ void GrabCut3DObjectSegmenter::setRectInMask() { assert( !mask_.empty() ); mask_.setTo( GC_BGD ); rect_.x = max(0, rect_.x); rect_.y = max(0, rect_.y); rect_.width = min(rect_.width, image_.cols-rect_.x); rect_.height = min(rect_.height, image_.rows-rect_.y); (mask_(rect_)).setTo( Scalar(GC_PR_FGD) ); }