Центр тяжести кластера оптического потока

Мне нужно найти центр тяжести векторов оптического потока. Я применил функцию OpenCV Lucas Kanade и визуально вижу векторы оптического потока. Теперь, как мне сгруппировать эти векторы и найти их центр тяжести? Я хочу найти место, где сгруппированы векторы потока.

Я получаю векторы Point2f, предыдущие точки и следующие точки. Я не уверен, как сгруппировать эти векторы. Если я использую функцию kmeans, то какой должна быть структура мата выборок?

kmeans(выборки, clusterCount, labels, TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 0,0001, 10000), попытки, KMEANS_PP_CENTERS, центры);

Спасибо.


person Aparupa Dasgupta    schedule 27.11.2012    source источник


Ответы (1)


Это зависит от того, каких результатов вы хотите достичь. Если вы хотите сгруппировать те же движущиеся пиксели, что и вы должны вычислить движение, оценив разницу между следующей и предыдущей точками, код будет выглядеть следующим образом:

std::vector<cv::Point2f> prevPts, currPts;
... run lucas kanade ...
cv::Mat samples(prevPts.size(), 2, CV_32FC1);
for(unsigned int n = 0; n < prevPts.size(); n++)
{
  samples.at<float>(n,0) = currPts[n].x - prevPts[n].x;
  samples.at<float>(n,1) = currPts[n].y - prevPts[n].y;
}
... run clustering

это как глобальный подход. Но в большинстве случаев вам также необходимо учитывать позицию. Затем вам нужно рассмотреть другие методы сегментации или добавить позицию в качестве дополнительных параметров.

person Tobias Senst    schedule 16.01.2013