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()); }
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(); }