2009-12-10 10 views
7

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

В настоящее время я пытаюсь использовать функцию «cvCalcOpticalFlowLK», а результат выводит векторы скорости x и y в виде «CvArr».

Так что я получил результат, но я не уверен, как использовать эти векторные массивы.

Мой вопрос в том, что ... как узнать, какова скорость каждого пикселя? Это просто значение каждого значения пикселя в этой конкретной точке?

Примечание: Я бы использовал другие функции оптического потока, такие как cvCalcOpticalFlowPyrLK(), поскольку это намного проще, но мне нужен плотный оптический поток.

+0

Итак, я играл с результирующим изображением, и я исхожу из предположения, что каждое значение пикселя представляет скорость каждого пикселя, но в каких единицах измеряется точно? Кто-нибудь знает, как эти «значения скорости» соответствуют скорости этого пикселя? Это пиксель за кадр? Или что-то другое? Значение каждого пикселя находится в 32-битной плавающей точке. – monky822

ответ

4

По-видимому, мое первоначальное предположение было правдой. «Velx» и «vely» выходы из функции оптического потока являются фактическими скоростями для каждого значения пикселя. Чтобы лучше извлечь их, я обратился к пикселю из необработанных данных и вытащил значение. Есть два способа сделать это.

cvGet2D() - этот способ медленнее, но если вам нужно только получить доступ к 1 пикселю, все в порядке.

или

(Uchar *) (Image-> ImageData + высота * image-> widthStep + ширина);

(изображение является IplImage, ширина и высота являются только соответствующие ширины и высоты изображения)

0

Если вам нужны векторы движения для каждого пикселя, то вам необходимо вычислить, что называется «плотным оптическим потоком» , Начиная с openCV 2.1, существует функция, которая выполняет именно это: calcOpticalFlowFarneback.

Смотрите ссылку ниже: http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html?highlight=calcopticalflowfarneback#cv2.calcOpticalFlowFarneback

0

velx и Vely являются оптический поток не фактическая скорость. Метод, который вы использовали, устарел. Используйте это calcOpticalFlowFarneback()

Смежные вопросы