Есть ли способ сделать основанную на функциях локализацию, используя OpenCV?

Я использую функцию обнаружения OpenCV для оценки положения робота на основе сравнения результатов LIDAR и виртуальной карты.
Я попытался использовать функцию определения шаров с последующим фланговым сопоставлением, но результат совпадения был неверным.
вот мой код

Ptr<ORB> orb_a = ORB::create();
Ptr<ORB> orb_b = ORB::create();
vector <cv::KeyPoint> kp1,kp2;
Mat desc1,desc2;

/* set orb :
1. ORB name
2. nfeatures
3. Nlevels
4. EdgeThreshold
5. First Level
6. WTA
7. Score Type
8. Patchsize
9. Scale Factor  */
Mat hmap,hlidar;

setORB(orb_a,500,8,100,0,4,ORB::HARRIS_SCORE,31,1.1);   //map
orb_a->detectAndCompute(lidarmap,noArray(),kp1,desc1);
drawKeypoints(lidarmap,kp1,hmap,Scalar::all(-1),DrawMatchesFlags::DEFAULT);

setORB(orb_b,50,8,30,0,4,ORB::HARRIS_SCORE,10,1.5); //lidar
orb_b->detectAndCompute(lidarused,noArray(),kp2,desc2);
drawKeypoints(lidarused,kp2,hlidar,Scalar::all(-1),DrawMatchesFlags::DEFAULT);

//flann

FlannBasedMatcher matcher;
std::vector<DMatch>matches;
matcher.match (desc1,desc2,matches);

double maxdist = 0, mindist = 100000;

for (int i = 0; i< desc1.rows; i++)
{
double dist = matches[i].distance;
if (dist<mindist) mindist = dist;
if (dist>maxdist) maxdist = dist;
}
if (mindist<0.02) mindist = 0.02;

printf ("min : %7.3f \t max : %7.3f \n",mindist,maxdist);

vector <DMatch> good_matches;

for (int i=1; i<desc1.rows; i++)
{
if (matches[i].distance >= 2*mindist && matches[i].distance<maxdist/2)
{
good_matches.push_back (matches[i]);
}
}
Mat imgmatches;
drawMatches (lidarmap,kp1,
lidarused,kp2,
good_matches,imgmatches,
Scalar::all(-1), Scalar::all(-1),
vector<char>(),DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

вот результат.
Обнаружение кажется нормальным, но это ужасно, когда я поворачиваю второе изображение

Фланчер подходит только для немасштабированного и не повернутого изображения? Могу ли я использовать фланг, чтобы соответствовать двухцветному изображению (BW)? или кто-то может указать, где я делаю это неправильно? заранее спасибо

1

Решение

По моему опыту, функции ORB слишком слабы для использования с FLANN. Попробуйте свой код с помощью sift или surf. Если это работает, вы можете попробовать настроить ORB.

Другой вариант заключается в использовании Библиотека DBoW2.
Они имеют результаты спуска с бинарными функциями.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]