gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:43 25 4
gpt4 key购买 nike

    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

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

最佳答案

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

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 - 有没有办法在opencv c++中将密集光流转换为稀疏光流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48837783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com