我在项目中两次使用了FlannBasedMatcher,但似乎第一个FlannBasedMatcher正在影响第二个FlannBasedMatcher的结果。
cvtColor(c_image1,hsi1,CV_BGR2HSV);
cvtColor(c_image2,hsi2,CV_BGR2HSV);
split(hsi1,channel_hsi1);
split(hsi2,channel_hsi2);
image1s=channel_hsi1[1];
image2s=channel_hsi2[1];
cvtColor(c_image1,image1,CV_RGB2GRAY);
cvtColor(c_image2,image2,CV_RGB2GRAY);
SiftFeatureDetector detector(800);
SiftDescriptorExtractor extractor;
FlannBasedMatcher matcher;
//第一场比赛
vector<KeyPoint>keypoint1,keypoint2;
detector.detect(image1,keypoint1);
detector.detect(image2,keypoint2);
Mat des1,des2;
extractor.compute(image1,keypoint1,des1);
extractor.compute(image2,keypoint2,des2);
vector<DMatch>matchpoints_i;
**matcher.match(des1,des2,matchpoints_i);//this line,if I delete it,the result of matchpoints_s will be right.But if I reserve it,the match condition of matchpoints_s will be bad,and even matchpoints_s[i].distance changed a lot.**
sort(matchpoints_i.begin(),matchpoints_i.end());
//第二场比赛
vector<KeyPoint>keypoint1s,keypoint2s;
detector.detect(image1s,keypoint1s);
detector.detect(image2s,keypoint2s);
Mat des1s,des2s;
extractor.compute(image1s,keypoint1s,des1s);
extractor.compute(image2s,keypoint2s,des2s);
vector<DMatch>matchpoints_s;
matcher.match(des1s,des2s,matchpoints_s);
sort(matchpoints_s.begin(),matchpoints_s.end());
for(size_t i=0;i<matchpoints_s.size();i++)
{
cout<< matchpoints_s[i].distance<<endl;
}
reserve the line,bad result
delete the line,good result
当我两次使用FlannBasedMatcher时有冲突吗?
最佳答案
当然,不应有冲突。
确保检查输入-特别是我担心这是通过HSV图像的S通道检测特征的好主意:
image1s=channel_hsi1[1];
image2s=channel_hsi2[1];
H通道可能会更好:
image1s=channel_hsi1[0];
image2s=channel_hsi2[0];
附言我已经仔细检查了我的工作代码-是的,您必须在将其与其他图像集一起使用之前调用matcher.clear()。
关于c++ - 第一次使用FlaannBasedMatcher会影响后来的FlannBasedMatcher的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48006330/