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

Posted

技术标签:

【中文标题】有没有办法在opencv c ++中将密集光流转换为稀疏光流?【英文标题】:is there a way to convert a dense optical flow to sparse optical flow in opencv c++? 【发布时间】:2018-02-17 04:06:49 【问题描述】:
    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);

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

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

上述函数找到图像中每个像素的密集光流i1

【问题讨论】:

【参考方案1】:

简单的将流场中各个位置的光流(位移)向量相加:

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);
createOptFlow_DIS(DISOpticalFlow::PRESET_ULTRAFAST)->calc(i1, i2, flowMat);
i2_corner.resize(i1_corner.size());
for( unsigned int i = 0; i < i1_corner.size(); i++)

    i2_corner[i] = i1_corner[i] + flowMat.at<cv::Point2f>(i1_corner[i]);

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

【讨论】:

以上是关于有没有办法在opencv c ++中将密集光流转换为稀疏光流?的主要内容,如果未能解决你的问题,请参考以下文章

如何在opencv中将图像转换为矩阵[重复]

在 Python 中将 openCV 图像转换为 PIL 图像(用于 Zbar 库)

如何在 C++/OpenCV 中将 cv::Point 添加到数组或向量?

如何在C中将无符号字符数组转换为十六进制字符串

如何在 Python(不使用 MedPy)或 C 中将 *.mha 文件转换为 *.nii 文件?

如何在python中用opencv打开优胜美地序列