gpt4 book ai didi

c++ - 基于 calcOpticalFlowFarneback 的 OpenCV 变形图像

转载 作者:可可西里 更新时间:2023-11-01 16:31:07 32 4
gpt4 key购买 nike

我正在尝试使用密集光流对图像执行复杂的扭曲。我正在尝试将第二张图片变形为与第一张图片大致相同的形状。

cv::Mat flow;
cv::calcOpticalFlowFarneback( mGrayFrame1, mGrayFrame2, flow, 0.5, 3, 15, 3, 5, 1.2, 0 );

cv::Mat newFrame = cv::Mat::zeros( frame.rows, frame.cols, frame.type() );
cv:remap( frame, newFrame, flow, cv::Mat(), CV_INTER_LINEAR );

我从两个灰度帧计算流量。我现在正尝试使用 cv::remap 函数使用此流信息重新映射我的原始(即非灰度)图像。但是,我从中得到了一个非常严重扭曲的图像。我最终得到了一张橙色和黑色的图像,它与我的原始图像有点相似。

如何将 cv::remap 与计算的 flow 一起使用?

最佳答案

remap 函数不能直接与flow 一起使用。必须使用一个单独的 map,它是通过反向流(从 frame2frame1)然后 offsetting 每个流 vector 通过其在像素网格上的 (x, y) 位置。请参阅下面的详细信息。

回想一下反向光流公式:

frame1(x, y) = frame2(x + flowx(x, y), y + flowy(x, y))

remap 函数使用指定的map 转换源图像:

dst(x, y) = src(mapx(x, y), mapy(x, y))

比较上面的两个等式,我们可以确定remap需要的map:

mapx(x, y) = x + flowx(x, y)
mapy(x, y) = y + flowy(x, y)

例子:

Mat flow; // backward flow
calcOpticalFlowFarneback(nextFrame, prevFrame, flow);

Mat map(flow.size(), CV_32FC2);
for (int y = 0; y < map.rows; ++y)
{
for (int x = 0; x < map.cols; ++x)
{
Point2f f = flow.at<Point2f>(y, x);
map.at<Point2f>(y, x) = Point2f(x + f.x, y + f.y);
}
}

Mat newFrame;
remap(prevFrame, newFrame, map);

关于c++ - 基于 calcOpticalFlowFarneback 的 OpenCV 变形图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459584/

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