void compute_cv_surf_keypoints(float *input, keypointslist& keypoints, int width, int height, siftPar &par){ pro::Image img(width,height,pro::Image::_8UC1); img.setU8Data(vector<uchar>(input,input+width*height),width,height,1); cv::normalize((cv::Mat&)img, (cv::Mat&)img, 0, 255, cv::NORM_MINMAX); std::vector<cv::KeyPoint> keys; std::vector<cv::KeyPoint>::iterator itk; cv::Mat descriptors; cv::SurfFeatureDetector detector(4000,3,4,false,false); detector.detect((const cv::Mat&)img, keys); cv::SurfDescriptorExtractor extractor(4000,3,4,false,false); cv::Scalar color(100,255,50); extractor.compute((const cv::Mat&)img, keys, descriptors); for(int i=0; i<descriptors.rows; ++i) { keypoint key; key.angle = keys[i].angle; key.scale = keys[i].octave; key.x = keys[i].pt.x; key.y = keys[i].pt.y; cv::Mat d(descriptors, cv::Rect(0,i,descriptors.cols,1)); for(int j=0;j<d.cols;j++){ key.vec[j] = d.data[j]; } keypoints.push_back(key); } }
/* Joan Pau: Add a new keypoint to a vector of keypoints Create a new keypoint and return list of keypoints with new one added. */ void MakeKeypoint( const flimage& grad, float octSize, float octScale, float octRow, float octCol, float angle, keypointslist& keys,siftPar &par) { keypoint newkeypoint; newkeypoint.x = octSize * octCol; /*x coordinate */ newkeypoint.y = octSize * octRow; /*y coordinate */ newkeypoint.scale = octSize * octScale; /* scale */ newkeypoint.angle = angle; /* orientation */ MakeKeypointSample(newkeypoint,grad,octScale,octRow,octCol,par); keys.push_back(newkeypoint); }