Сегментация изображения на основе оптического потока

Я использую c ++, библиотеку OpenCV и в своем программном обеспечении оценил оптический поток в видео. Теперь я хочу сгруппировать некоторые движущиеся объекты, например, движущиеся машины. Я использовал алгоритм плотного оптического потока (Farneback).

Мои первые мысли на данный момент — использовать алгоритм «k означает» для кластеризации.

Я подумал об использовании результатов оптического потока Farneback для вычисления смещения кадров в каждом направлении следующим образом:

Например. :

Пусть Dx — смещение в направлении x (положительное или отрицательное), а Dy — смещение в направлении y (положительное или отрицательное).

Затем я передаю массив [Dx, Dy] в качестве входных данных для k означает с k = 2 кластеров. Я надеюсь, что это даст грубый фон / вычитание переднего плана.

Однако я сталкиваюсь с проблемами при вычислении смещения, потому что вывод calcOpticalFlowFarneback является потоком InputOutputArray. Должен ли я получить доступ к этому массиву с помощью такой функции, например? :

findDisplacements(const Mat& flow, int step) {
const Point2f& Dx,Dy;
const Point2f& fxy = flow.at<Point2f>(y, x);
Dx=Point(cvRound(x+fxy.x))-Point(x,y);
Dy=Point(cvRound(y+fxy.y))-Point(y,x);
}

0

Решение

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

cv::Mat img0 = cv::imread("test0.png");    // Image at time t-1
cv::Mat img1 = cv::imread("test1.png");    // Image at time t
cv::Mat flow;
//estimate Optical Flow
cv::calcOpticalFlowFarneback(img0, img1, flow, 0.5, 3, 21, 20, 5, 1.1);
std::vector<cv::Point2f> samples(flow.rows * flow.cols);
// arange sample vector
int n = 0;
for( int r = 0; r < flow.rows; r++) {
for( int c = 0; c < flow.cols; c++){
samples[n++] = flow.at<cv::Point2f>(r,c);
}}
cv::kmeans(samples, ...
0

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

Вы можете использовать историю движения.

updateMotionHistory(silh, mhi, timestamp, MHI_DURATION);
calcMotionGradient(mhi, mask, orient, MAX_TIME_DELTA, MIN_TIME_DELTA, 3);
segmentMotion(mhi, segmask, regions, timestamp, MAX_TIME_DELTA);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector