コード例 #1
0
ファイル: test_func.cpp プロジェクト: Wuffels/DCMTTest
void FuncTest::inout_rectTest()
{
    std::vector<cv::KeyPoint> keypoints;
    keypoints.push_back(cv::KeyPoint(10, 10, 1));
    keypoints.push_back(cv::KeyPoint(21.5, 10, 1));
    keypoints.push_back(cv::KeyPoint(50, 10, 1));
    keypoints.push_back(cv::KeyPoint(10, 29.3, 1));
    keypoints.push_back(cv::KeyPoint(31.1, 55.7, 1));
    keypoints.push_back(cv::KeyPoint(50, 38.2, 1));
    keypoints.push_back(cv::KeyPoint(10, 70, 1));
    keypoints.push_back(cv::KeyPoint(41.12, 70, 1));
    keypoints.push_back(cv::KeyPoint(50, 70, 1));
    keypoints.push_back(cv::KeyPoint(100.1, 75.58, 1));
    cv::Point2f topleft(10.0,10.0);
    cv::Point2f bottomright(50.0,70.0);
    std::vector<cv::KeyPoint> in;
    std::vector<cv::KeyPoint> out;
    inout_rect(keypoints, topleft, bottomright, in, out);
    std::vector<cv::KeyPoint> in_test;
    std::vector<cv::KeyPoint> out_test;
    out_test.push_back(cv::KeyPoint(10, 10, 1));
    out_test.push_back(cv::KeyPoint(21.5, 10, 1));
    out_test.push_back(cv::KeyPoint(50, 10, 1));
    out_test.push_back(cv::KeyPoint(10, 29.3, 1));
    in_test.push_back(cv::KeyPoint(31.1, 55.7, 1));
    out_test.push_back(cv::KeyPoint(50, 38.2, 1));
    out_test.push_back(cv::KeyPoint(10, 70, 1));
    out_test.push_back(cv::KeyPoint(41.12, 70, 1));
    out_test.push_back(cv::KeyPoint(50, 70, 1));
    out_test.push_back(cv::KeyPoint(100.1, 75.58, 1));

    QCOMPARE(in.size(), in_test.size());
    QCOMPARE(out.size(), out_test.size());
}
コード例 #2
0
ファイル: CMT.cpp プロジェクト: JpEncausse/libCMT
void CMT::initialise(cv::Mat im_gray0, cv::Point2f topleft, cv::Point2f bottomright)
{

    //Initialise detector, descriptor, matcher
    detector = cv::Algorithm::create<cv::FeatureDetector>(detectorType.c_str());
    descriptorExtractor = cv::Algorithm::create<cv::DescriptorExtractor>(descriptorType.c_str());
    descriptorMatcher = cv::DescriptorMatcher::create(matcherType.c_str());
    std::vector<std::string> list;
    cv::Algorithm::getList(list);

    //Get initial keypoints in whole image
    std::vector<cv::KeyPoint> keypoints;
    detector->detect(im_gray0, keypoints);

    //Remember keypoints that are in the rectangle as selected keypoints
    std::vector<cv::KeyPoint> selected_keypoints;
    std::vector<cv::KeyPoint> background_keypoints;
    inout_rect(keypoints, topleft, bottomright, selected_keypoints, background_keypoints);
    descriptorExtractor->compute(im_gray0, selected_keypoints, selectedFeatures);

    if(selected_keypoints.size() == 0)
    {
        printf("No keypoints found in selection");
        return;
    }

    //Remember keypoints that are not in the rectangle as background keypoints
    cv::Mat background_features;
    descriptorExtractor->compute(im_gray0, background_keypoints, background_features);

    //Assign each keypoint a class starting from 1, background is 0
    selectedClasses = std::vector<int>();
    for(int i = 1; i <= selected_keypoints.size(); i++)
        selectedClasses.push_back(i);
    std::vector<int> backgroundClasses;
    for(int i = 0; i < background_keypoints.size(); i++)
        backgroundClasses.push_back(0);

    //Stack background features and selected features into database
    featuresDatabase = cv::Mat(background_features.rows+selectedFeatures.rows, std::max(background_features.cols,selectedFeatures.cols), background_features.type());
    if(background_features.cols > 0)
        background_features.copyTo(featuresDatabase(cv::Rect(0,0,background_features.cols, background_features.rows)));
    if(selectedFeatures.cols > 0)
        selectedFeatures.copyTo(featuresDatabase(cv::Rect(0,background_features.rows,selectedFeatures.cols, selectedFeatures.rows)));

    //Same for classes
    classesDatabase = std::vector<int>();
    for(int i = 0; i < backgroundClasses.size(); i++)
        classesDatabase.push_back(backgroundClasses[i]);
    for(int i = 0; i < selectedClasses.size(); i++)
        classesDatabase.push_back(selectedClasses[i]);

    //Get all distances between selected keypoints in squareform and get all angles between selected keypoints
    squareForm = std::vector<std::vector<float> >();
    angles = std::vector<std::vector<float> >();
    for(int i = 0; i < selected_keypoints.size(); i++)
    {
        std::vector<float> lineSquare;
        std::vector<float> lineAngle;
        for(int j = 0; j < selected_keypoints.size(); j++)
        {
            float dx = selected_keypoints[j].pt.x-selected_keypoints[i].pt.x;
            float dy = selected_keypoints[j].pt.y-selected_keypoints[i].pt.y;
            lineSquare.push_back(sqrt(dx*dx+dy*dy));
            lineAngle.push_back(atan2(dy, dx));
        }
        squareForm.push_back(lineSquare);
        angles.push_back(lineAngle);
    }

    //Find the center of selected keypoints
    cv::Point2f center(0,0);
    for(int i = 0; i < selected_keypoints.size(); i++)
        center += selected_keypoints[i].pt;
    center *= (1.0/selected_keypoints.size());

    //Remember the rectangle coordinates relative to the center
    centerToTopLeft = topleft - center;
    centerToTopRight = cv::Point2f(bottomright.x, topleft.y) - center;
    centerToBottomRight = bottomright - center;
    centerToBottomLeft = cv::Point2f(topleft.x, bottomright.y) - center;

    //Calculate springs of each keypoint
    springs = std::vector<cv::Point2f>();
    for(int i = 0; i < selected_keypoints.size(); i++)
        springs.push_back(selected_keypoints[i].pt - center);

    //Set start image for tracking
    im_prev = im_gray0.clone();

    //Make keypoints 'active' keypoints
    activeKeypoints = std::vector<std::pair<cv::KeyPoint,int> >();
    for(int i = 0; i < selected_keypoints.size(); i++)
        activeKeypoints.push_back(std::make_pair(selected_keypoints[i], selectedClasses[i]));

    //Remember number of initial keypoints
    nbInitialKeypoints = selected_keypoints.size();
}