OpenCV displaying a 2-channel image (optical flow)

前端 未结 2 1303
小蘑菇
小蘑菇 2021-02-05 22:11

I have optical flow stored in a 2-channel 32F matrix. I want to visualize the contents, what\'s the easiest way to do this?

How do I convert a CV_32FC2 to R

2条回答
  •  北海茫月
    2021-02-05 22:43

    The MPI Sintel Dataset provides C and MatLab code for visualizing computed flow. Download the ground truth optical flow of the training set from here. The archive contains a folder flow_code containing the mentioned source code.

    You can port the code to OpenCV, however, I wrote a simple OpenCV wrapper to easily use the provided code. Note that the method MotionToColor is taken from the color_flow.cpp file. Note the comments in the listing below.

    // 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(i, j)[0];
            cFlow.Pixel(j, i, 1) = flow.at(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(i, j)[0] = cImage.Pixel(j, i, 0);
            image.at(i, j)[1] = cImage.Pixel(j, i, 1);
            image.at(i, j)[2] = cImage.Pixel(j, i, 2);
        }
    }
    
    // Display or output the image ...
    

    Below is the result when using the Optical Flow code and example images provided by Ce Liu.

    Example images provided by Ce Liu.

    Optical flow computed using the implementation provided by Ce Liu.

提交回复
热议问题