mrgloom 242 Жалоба Опубликовано October 31, 2012 вообщем задача такая. есть 2 набора точек и надо по метрике евклидову расстоянию указать какие точки из 2-х множеств не покрыты, т.е. например если для точки первого множества есть хотя бы 1 точка второго множества отстоящая от неё менее чем на threshold, то значит точка покрыта. и так надо для всех точек первого и второго множества. хотелось бы не решать полным перебором точек. возможно knnsearch который в opencv с этим справится?(только я не уверен там помоему приближённый алгоритм) или надо строить quad tree чтобы быстрее отсекать? + потом еще надо точки которые непокрыты как то обвести баунд боксами, скажем делим все непокрытые точки опять же по расстоянию на группы, проверяем кол-во в группе если больше N, то обводим рамкой. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано October 31, 2012 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); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 31, 2012 Я обычно так конвертирую: src.convertTo(dst,CV_32FC1); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано October 31, 2012 дело в том что если сделать так 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; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 31, 2012 Сделайте свой класс, производный от vector и перегрузите оператор присваивания как Вам угодно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано November 1, 2012 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, причем в порядке от меньшего к большему. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах