calcOpticalFlowPyrLK()的源码
时间: 2024-02-05 15:04:28 浏览: 101
OpenCV中的calcOpticalFlowPyrLK()函数是用于计算光流的函数,其源码如下:
```c++
void cv::calcOpticalFlowPyrLK(
InputArray prevImg,
InputArray nextImg,
InputArray prevPts,
InputOutputArray nextPts,
OutputArray status,
OutputArray err,
Size winSize,
int maxLevel,
TermCriteria criteria,
int flags,
double minEigThreshold)
{
// 检查输入输出参数是否合法
CV_INSTRUMENT_REGION()
CV_Assert(prevImg.depth() == CV_8U || prevImg.depth() == CV_16U || prevImg.depth() == CV_32F);
CV_Assert(prevImg.size() == nextImg.size() && prevImg.type() == nextImg.type());
CV_Assert(prevPts.isContinuous() && prevPts.type() == CV_32FC2 && prevPts.rows() == 1);
CV_Assert(nextPts.isContinuous() && nextPts.type() == prevPts.type() && nextPts.size() == prevPts.size());
// 初始化变量
std::vector<Point2f> prevPtsVec, nextPtsVec;
prevPts.getMat().convertTo(prevPtsVec, CV_32F);
nextPts.getMatRef().convertTo(nextPtsVec, CV_32F);
std::vector<unsigned char> statusVec;
if (status.needed())
{
status.create((int)prevPtsVec.size(), 1, CV_8U, -1, true);
status.getMatRef().setTo(Scalar::all(0));
statusVec.resize(prevPtsVec.size());
}
std::vector<float> errVec;
if (err.needed())
{
err.create((int)prevPtsVec.size(), 1, CV_32F, -1, true);
errVec.resize(prevPtsVec.size());
}
// 调用光流计算函数
calcOpticalFlowPyrLK(
prevImg, nextImg, prevPtsVec, nextPtsVec,
statusVec, errVec, winSize, maxLevel, criteria, flags, minEigThreshold);
// 将输出结果拷贝到输出参数中
std::copy(nextPtsVec.begin(), nextPtsVec.end(), (Point2f*)nextPts.getMat().data);
if (status.needed())
{
std::copy(statusVec.begin(), statusVec.end(), status.getMat().data);
}
if (err.needed())
{
std::copy(errVec.begin(), errVec.end(), err.getMat().data);
}
}
```
该函数的主要功能是计算两个图像之间的光流,即计算两个图像中的特征点在时间上的变化。输入参数包括前一帧图像prevImg、后一帧图像nextImg、前一帧图像中的特征点prevPts,输出参数包括后一帧图像中的特征点nextPts、特征点的状态status和误差err。
该函数首先检查输入输出参数是否合法,然后将输入参数转换为std::vector类型,并初始化输出参数,然后调用calcOpticalFlowPyrLK()函数计算光流,最后将输出结果拷贝到输出参数中。
阅读全文