Перейти к содержимому
Compvision.ru
mrgloom

сравнить 2 набора точек

Recommended Posts

вообщем задача такая.

есть 2 набора точек и надо по метрике евклидову расстоянию указать какие точки из 2-х множеств не покрыты, т.е. например если для точки первого множества есть хотя бы 1 точка второго множества отстоящая от неё менее чем на threshold, то значит точка покрыта. и так надо для всех точек первого и второго множества.

хотелось бы не решать полным перебором точек.

возможно knnsearch который в opencv с этим справится?(только я не уверен там помоему приближённый алгоритм) или надо строить quad tree чтобы быстрее отсекать?

+ потом еще надо точки которые непокрыты как то обвести баунд боксами, скажем делим все непокрытые точки опять же по расстоянию на группы, проверяем кол-во в группе если больше N, то обводим рамкой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 vector<cv::Point> pts

    cv::flann::Index tree= cv::flann::Index(cv::Mat(pts),cv::flann::KDTreeIndexParams(1));
так не работает. а как можно сконвертировать без копирования? нужно видимо типа CV_32FC1
cv::Mat in_mat(pts.size(),2,CV_32FC1);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я обычно так конвертирую:

src.convertTo(dst,CV_32FC1);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

дело в том что если сделать так

vector<cv::Point> pts;

cv::Mat in_mat(pts);

то получится размерность
pts.size(),1
а не
cv::Mat in_mat(pts.size(),2,CV_32FC1);
можно конечно так, но это криво как то
cv::Mat in_mat(pts.size(),2,CV_32FC1);

	for(int i=0;i<pts.size();++i)

	{

		in_mat.at<float>(i,0)= pts[i].x;

		in_mat.at<float>(i,1)= pts[i].y;

	}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сделайте свой класс, производный от vector и перегрузите оператор присваивания как Вам угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

vector<cv::Point2f> scheme_pts;


	//cv::flann::Index tree= cv::flann::Index(cv::Mat(scheme_pts).reshape(1),cv::flann::KDTreeIndexParams(1));

	cv::flann::Index tree= cv::flann::Index(cv::Mat(scheme_pts).reshape(1),cv::flann::LinearIndexParams());

	//cv::flann::Index tree= cv::flann::Index(cv::Mat(scheme_pts).reshape(1),cv::flann::AutotunedIndexParams(1,0,0,1));


	vector<float> vec_f(2);

	vector<int> id(scheme_pts.size()); //size?

	vector<float> dists(scheme_pts.size());//size?

	cv::flann::SearchParams params; //32 //precision? если использовать LinearIndexParams?

	float radius=10;//какая метрика?

	for(int i=0;i<scheme_pts.size();++i)

	{

		vec_f[0]= scheme_pts[i].x;

		vec_f[1]= scheme_pts[i].y;

		tree.radiusSearch(vec_f,id,dists,radius,params);

	}

проверяю как работает, почему то подавая точку в radiusSearch она стоит в векторе id не на первом месте, ну это еще ладно можно было бы списать на точность, т.к. в векторе dists всё по нулям, но почему то иногда вообще искомой точки там нет, а по идее она должна быть первой вообще в списке.

возможно это как то связано с тем, что flann даёт приближённое решение, но я использовал LinearIndexParams так что странно.

потом еще непонятно как понять сколько в векторе id возвращенных точек. я создал его размером с набор точек(что плохо по памяти) и в нём лежат номера точек которые находятся ближе чем на radius, причем в порядке от меньшего к большему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×