- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经可以使用在 OpenCV 中实现的 Lucas Kanade 跟踪 SIFT 或 SURF 特征,因为 Lucas Kanade 以任何方式跟踪稀疏特征,但是我正在尝试使用在 OpenCV 中实现的 Farneback 光流算法来跟踪那些稀疏特征,是否有算法为此?
Realtime Dense Optical flow tracking
请查看此视频:
开发人员声称他们使用密集方法“Farneback”而不是稀疏方法“Lucas-Kanade”来跟踪选定的稀疏特征。他们是怎么做到的?
最佳答案
要跟踪具有密集光流场的特征 flow
可以按如下方式完成:
// read images
cv:Mat prevImg = cv::imread( filename0 ); // image data at time t
cv::Mat currImg = cv::imread( filename1 ); // image data at time t and t + 1
cv::Mat flowMat; // storage for dese optical flow field
std::vector<cv::Point2f> prevPoints; // points to be track
// initialize points to track (example)
prevPoints.push_back( cv::Point2f( 50.3f, 30.f ) );
std::vector<cv::Point2f> currPoints( prevPoints.size()); // tracked point position
// compute dense flow field (example)
cv::calcOpticalFlowFarneback(prevImg, currImg, flowMat, 0.4, 1, 12, 2, 8, 1.2, 0);
// track points based on dense optical flow field and bilinear interpolation
for( unsigned int n = 0; n < prevPoints.size(); ++n )
{
float ix = floor(prevPoints[n].x);
float iy = floor(prevPoints[n].y);
float wx = prevPoints[n].x - ix;
float wy = prevPoints[n].y - iy;
float w00 = (1.f - wx) * (1.f - wy);
float w10 = (1.f - wx) * wy;
float w01 = wx * (1.f - wy);
float w11 = wx * wy;
if( prevPoints[n].x >= flowMat.cols - 1 || prevPoints[n].y >= flowMat.rows - 1)
{
// these points are out of the image roi and cannot be tracked.
currPoints[n] = prevPoints[n];
}
else
{
/*
bilinear interpolation of the flow vector from the flow field at a given location.
The bilinear interpolation has to be applied since the points to track can be given at subpixel level
*/
currPoints[n] = prevPoints[n]
+ flowMat.at<cv::Point2f>(iy, ix) * w00
+ flowMat.at<cv::Point2f>(iy+1, ix) * w10
+ flowMat.at<cv::Point2f>(iy, ix+1) * w01
+ flowMat.at<cv::Point2f>(iy+1, ix+1) * w11;
}
}
}
关于c++ - 如何使用 Farneback 的密集光流方法跟踪稀疏特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44168581/
我正在尝试计算两帧之间的光流,然后使用计算出的光流扭曲前一帧。我发现 cv2 有 Farneback Optical FLow,所以我用它来计算 Flow。我从 cv2 tutorial 中获取了默认
我已经可以使用在 OpenCV 中实现的 Lucas Kanade 跟踪 SIFT 或 SURF 特征,因为 Lucas Kanade 以任何方式跟踪稀疏特征,但是我正在尝试使用在 OpenCV 中实
我的应用程序使用 Opencv gpu 类 gpu::FarnebackOpticalFlow 来计算输入视频的一对连续帧之间的光流。为了加快进程,我利用 OpenCV 的 TBB 支持在多线程中运行
我正在写论文,任务的一部分是在图像之间进行插值以创建中间图像。这项工作必须使用 openCV 2.4.13 在 c++ 中完成。到目前为止,我找到的最佳解决方案是计算光流和重新映射。但是这个解决方案有
我编写了一段代码来创建边界框并在其中绘制 Farneback 光流。光流通常是事先计算好的,然后为每个 ROI 框单独绘制。 当我绘制流程时,问题就来了。流量看起来正常,但向下和向右移动。这是输出,注
我想你们中有些人知道这个函数 flow = cv2.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 来自 Ope
我正在尝试使用 Opencv 的密集光流函数的输出来绘制运动矢量的箭袋图,但无法找到该函数实际输出的内容。这是代码: import cv2 import numpy as np cap = cv2.V
我是一名优秀的程序员,十分优秀!