Beispiel #1
0
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) );
}