初学图像处理, 请多多指教!
我现在想解决的是用单个模板去匹配测试图中的多个目标(目标有仿射变换),参照了现成的一些SURF算法提取特征值进行匹配,可是这样只能匹配到一个目标。
后来发现匹配的knnmatch函数可以对一个 query descriptor返回k个最佳匹配,可是效果并不好, 不知有什么建议?十分感谢!
代码如下:
Mat img1 = imread( "q.jpg", CV_LOAD_IMAGE_GRAYSCALE );
Mat img2 = imread( "qw.jpg", CV_LOAD_IMAGE_GRAYSCALE );
//-- Step 1: Detect the keypoints using Sift Detector
SiftFeatureDetector detector( hessian );
vector<KeyPoint> queryKeypoints, trainKeypoints;
detector.detect( img1, queryKeypoints );
detector.detect( img2, trainKeypoints );
//-- Step 2: Extract the keypoints using Sift Extractor
Mat queryDescriptor,trainDescriptor;// extract keypoints
SiftDescriptorExtractor extractor; //Create Descriptor Extractor
extractor.compute( img1, queryKeypoints, queryDescriptor );
extractor.compute( img2, trainKeypoints, trainDescriptor );
//--Step3: Match
vector<vector<DMatch>> m_knnMatches;
vector<DMatch>m_Matches;
vector<DMatch>n_Matches;
const float minRatio = 1.f / 1.5f;
matcher.knnMatch(queryDescriptor,trainDescriptor,m_knnMatches,3);
for (size_t i=0; i<m_knnMatches.size(); i++)
{
const cv::DMatch& bestMatch = m_knnMatches[i][0];
const cv::DMatch& betterMatch = m_knnMatches[i][1];
const cv::DMatch& betterrMatch = m_knnMatches[i][2];
float distanceRatio = bestMatch.distance / betterMatch.distance;
float distanceRatio1 = betterMatch.distance / betterrMatch.distance;
if (distanceRatio < minRatio)
{
m_Matches.push_back(bestMatch);
}
if (distanceRatio1 < minRatio)
{
n_Matches.push_back(betterMatch);
}
}
Mat img_matches;
drawMatches( img1,queryKeypoints,img2,trainKeypoints,m_Matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
Mat img_matches2;
drawMatches( img1,queryKeypoints,img2,trainKeypoints,n_Matches, img_matches2, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );