我试图编写一个程序,使用ORB算法来检测和计算图像和视频的关键点,并使用BruteForce匹配器匹配描述符向量。我面临的问题是,每当我在Visual C ++上运行程序时,当我试图检测的对象不可见时,我的算法就是在检测到的关键点之间绘制所有假定的匹配线(它匹配所有关键点)。当我试图检测到的物体出现在图像中时,我不会面对这个问题,事实上,我几乎没有任何不匹配。
这是主要测试的简短序列:
•将输入图像转换为灰度
•将输入视频转换为灰度
•检测关键点并从输入灰度图像中提取描述符
•检测关键点并从输入灰度视频中提取描述符
•匹配描述符(见下文)
BFMatcher matcher(NORM_HAMMING);
vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
double max_dist = 0; double min_dist = 100;
////calcularea distantelor max si min distances intre keypoints
for (int i = 0; i < descriptors_1.rows; i++)
{
double dist = matches[i].distance;
if (dist < min_dist) min_dist = dist;
if (dist > max_dist) max_dist = dist;
}
printf("-- Max dist : %f \n", max_dist);
printf("-- Min dist : %f \n", min_dist);
std::vector< DMatch > good_matches;
for (int i = 0; i < descriptors_1.rows; i++)
{
if (matches[i].distance <= max(2 * min_dist, 0.02))
{
good_matches.push_back(matches[i]);
}
}
////-- Desenarea matches-urilor "bune"
Mat img_matches;
drawMatches(img1, keypoints_1, cadruProcesat, keypoints_2,
good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
////-- Afisare matches
imshow("good matches", img_matches);
int gm = 0;
for (int i = 0; i < (int)good_matches.size(); i++)
{
printf("-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx);
gm += 1;
}
printf("%d",gm);
///////////////////////////////////////////////////////////////////
//imshow(windowName2, cadruProcesat);
switch (waitKey(10)) {
case 27:
//tasta 'esc' a fost apasata(ASCII 27)
return 0;
}
}
return 0;
请帮我找到问题。
答案 0 :(得分:0)
所以我将min_dist的值改为15(不是100),似乎它对模式的效果非常好......但这是通过反复试验来完成的......