有没有办法在opencv c ++中将密集光流转换为稀疏光流?

时间:2018-02-17 04:06:50

标签: opencv image-processing opticalflow

    Mat i1 = imread("1.jpg", 0); //read as a gray scale image
    Mat i2 = imread("2.jpg", 0); //reas as a gray scale image

    Mat flowMat; 

    vector <Point2f> i1_corner, i2_corner;
    vector <uchar> status;
    vector <float> err;

    goodFeaturesToTrack(i1, i1_corner, 1000, 0.01, 30);
    calcOpticalFlowPyrLK(i1, i2, i1_corner, i2_corner, status, err);

我想跟踪 i2 图片中的 i1_corner 功能点

在上面的代码中我使用迭代的Lucas-Kanade方法跟踪它们

calcOpticalFlowPyrLK(i1, i2, i1_corner, i2_corner, status, err);

但是我可以使用DIS光流跟踪它们,这在opencv的以下函数中实现

createOptFlow_DIS(DISOpticalFlow::PRESET_ULTRAFAST)->calc(i1, i2, flowMat);

上述函数为图像 i1

中的每个像素找到密集的光流

1 个答案:

答案 0 :(得分:0)

简单地在流场中添加相应位置的光流(位移)矢量:

sqlitebrowser

请注意,最后一行读取像素位置处的流量,即i1_corner位置是四舍五入的。要获得子像素级别的流量值,您需要在那里执行插值。但是,由于特别是DIS流程计算非常模糊(粗糙)的流场,插值不会显着改变跟踪。