OpenCV3:金字塔Lucas-Kanade光流算法之函数接口calcOpticalFlowPyrLK的使用

Lucas-Kanade光流算法的原理具体可以参考这篇博客:Lucas–Kanade(LK)光流算法详解

OpenCV1.0接口参考:OpenCV:金字塔Lucas-Kanade光流算法之函数接口cvCalcOpticalFlowPyrLK的使用

函数原型:

void calcOpticallFlowPyrLK (
    InuputArray prevImg, 
    InputArray nextImg, 
    InputArray prevPts, 
    InputOutputArray nextPts, 
    OutputArray status, 
    OutputArray err,
    Size winSize = Size(21,21), 
    int maxLevel = 3, 
    TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), 
    int flags = 0, 
    double minEigThreshold = 1e-4
);

参数解析:

程序示例:

#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

const int MAX_CORNERS = 500;
int main()
{
	cv::Mat imageA = cv::imread("img00001.png", 1);
	cv::Mat imageB = cv::imread("img00002.png", 1);

	//使用灰度图像进行角点检测
	cv::Mat imageA_gray, imageB_gray;
	cv::cvtColor(imageA, imageA_gray, cv::COLOR_BGR2GRAY);
	cv::cvtColor(imageB, imageB_gray, cv::COLOR_BGR2GRAY);
	 
	//设置角点检测参数
	std::vector<cv::Point2f> cornersA;
	int max_corners = MAX_CORNERS;
	double quality_level = 0.01;
	double min_distance = 5.0;
	int block_size = 3;
	bool use_harris = false;
	double k = 0.04;
 
	//角点检测
	cv::goodFeaturesToTrack(imageA_gray,
		cornersA,
		max_corners,
		quality_level,
		min_distance,
		cv::Mat(),
		block_size,
		use_harris,
		k);
	
	cv::Size winSize(10, 10);
	cv::TermCriteria criteria = cv::TermCriteria(
					cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,
					20,
					0.03);
 
	//亚像素检测
	cv::cornerSubPix(imageA_gray, cornersA, winSize, cv::Size(-1, -1), criteria);
 
	
	std::vector<cv::Point2f> cornersB;
	std::vector<uchar> status;
	std::vector<float> err;
	cv::calcOpticalFlowPyrLK(imageA_gray, imageB_gray, cornersA, cornersB, status, err, winSize, 5, criteria, 0, 0.001);

	cv::Mat	imageC = imageB.clone();
	for( int i = 0; i< cornersA.size(); i++ ) 
	{
        if(status[i] == '0') continue;
        cv::Point p0 = cv::Point(cvRound(cornersA[i].x), cvRound(cornersA[i].y ));
        cv::Point p1 = cv::Point(cvRound(cornersB[i].x), cvRound( cornersB[i].y));
        line( imageC, p0, p1, cv::Scalar(0,0,255), 1, CV_AA);
    }
    
    cv::imshow("ImageA",imageA);
    cv::imshow("ImageB",imageB);
    cv::imshow("LKpyr_OpticalFlow",imageC);

	cv::waitKey(0);
	return 0;
}

运行结果:

程序所需图片:

img00001.png

img00002

 

 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值