В наборе MPI Sintel имеется код C и MatLab для визуализации вычисленного потока. Загрузите наземный оптический поток обучающего набора с здесь . Архив содержит папку flow_code
с указанным исходным кодом.
Вы можете портировать код на OpenCV, однако я написал простую оболочку OpenCV, чтобы легко использовать предоставленный код. Обратите внимание, что метод MotionToColor
взят из файла color_flow.cpp
. Обратите внимание на комментарии в листинге ниже.
// Important to include this before flowIO.h!
#include "imageLib.h"
#include "flowIO.h"
#include "colorcode.h"
// I moved the MotionToColor method in a separate header file.
#include "motiontocolor.h"
cv::Mat flow;
// Compute optical flow (e.g. using OpenCV); result should be
// 2-channel float matrix.
assert(flow.channels() == 2);
// assert(flow.type() == CV_32F);
int rows = flow.rows;
int cols = flow.cols;
CFloatImage cFlow(cols, rows, 2);
// Convert flow to CFLoatImage:
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cFlow.Pixel(j, i, 0) = flow.at<cv::Vec2f>(i, j)[0];
cFlow.Pixel(j, i, 1) = flow.at<cv::Vec2f>(i, j)[1];
}
}
CByteImage cImage;
MotionToColor(cFlow, cImage, max);
cv::Mat image(rows, cols, CV_8UC3, cv::Scalar(0, 0, 0));
// Compute back to cv::Mat with 3 channels in BGR:
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
image.at<cv::Vec3b>(i, j)[0] = cImage.Pixel(j, i, 0);
image.at<cv::Vec3b>(i, j)[1] = cImage.Pixel(j, i, 1);
image.at<cv::Vec3b>(i, j)[2] = cImage.Pixel(j, i, 2);
}
}
// Display or output the image ...
Ниже приведен результат при использовании кода оптического потока и примеров изображений, предоставленных Ce Liu .
![Example images provided by Ce Liu.](https://i.stack.imgur.com/NSJ2c.gif)
![Optical flow computed using the implementation provided by Ce Liu.](https://i.stack.imgur.com/FsG1Z.png)