Как извлечь векторы скорости пикселей из calcOpticalFlowFarneback

Я пытался извлечь векторы скорости каждого пикселя в двух кадрах. Я использовал функцию opencv как потоки:

calcOpticalFlowFarneback(Previous_Gray, Current_Gray, Optical_Flow, 0.5, 3, 15, 3, 5, 1.2, 0);

Previous_Gray = previous frame 
Current_Gray = current frame 

И это дает мне массив в 3-м аргументе Optical_Flow, но я не могу сказать, как извлечь векторы скорости, используя этот массив.

Заранее спасибо.

Давид


person Dave    schedule 21.05.2013    source источник


Ответы (3)


Mat&flow: вычисленное изображение потока; будет иметь тот же размер, что и prevImg, и тип CV_32FC2.

Этот тип означает, что у вас есть 2 переменные с плавающей запятой (предположительно x и y) для движения каждого пикселя. Попробуй это:

Optical_Flow.at<cv::Point2f>(1023,767).x
Optical_Flow.at<cv::Point2f>(1023,767).y
person Boyko Perfanov    schedule 21.05.2013
comment
Было бы лучше использовать cv::Point2f для доступа к местоположениям пикселей, так как это из C++ API. В противном случае, хороший ответ. - person Aurelius; 21.05.2013
comment
Уважаемые Perfanoff и Aurelius, Большое спасибо, кажется, работает. Я новичок в opencv, и оптический поток свяжется с вами, ребята, если у меня возникнут какие-либо проблемы :) Спасибо. - person Dave; 22.05.2013
comment
Приятно слышать. Если ответ помог вам, не стесняйтесь принимать его как правильный :) - person Boyko Perfanov; 22.05.2013
comment
ребята спасибо все работает. но у меня есть одна проблема: Optical_Flow.at‹cv::Point2f›().x Optical_Flow.at‹cv::Point2f›().y дает мне, как далеко пиксел перемещается по осям x и y правильно, но что я хочу была скорость пикселя, которую я ожидал, поскольку этот пиксель перемещается так много. Является ли это возможным? еще раз спасибо :) - person Dave; 28.05.2013
comment
Для этого вы можете использовать cartToPolar. - person Mene; 04.05.2015

Чтобы извлечь вычисленные векторы оптического потока, вы можете использовать следующую функцию:

static void writeOpticalFlowVectors(const Mat& flow){
    std::ofstream myfile;
    std::string fullPath = "opticalFlowVectors.txt";
    myfile.open (fullPath.c_str());

    for(std::size_t x = 0; x < flow.rows; ++x){
        for(std::size_t y = 0; y < flow.cols; ++y){
            myfile << flow.at<cv::Point2f>(x,y).x;
            myfile<< ", ";
            myfile<< flow.at<cv::Point2f>(x,y).y;
            myfile << "\n";     
        }
    }
    myfile.close();
}

Это будет перебирать ваш выходной Mat и записывать каждый вектор в форме x, y в файл txt.

person Kevin Katzke    schedule 24.08.2016

person    schedule
comment
Этот код отобразит рассчитанный плотный оптический поток в окне. Он не будет извлекать какую-либо вычисленную информацию для дальнейших манипуляций. - person Kevin Katzke; 24.08.2016