opencv-基于光流的对象跟踪

本文介绍了光流的基本原理,包括由物体或相机运动引起的图像物体视运动模式,并探讨了光流在运动结构、视频压缩和视频稳定等领域的应用。接着详细讲解了稀疏光流KLT的方法,其依赖于亮度恒定、缓慢移动和空间一致性的假设,以及稠密光流HF的实现,后者无需特征点检测,直接计算两帧间的像素差异。最后提到了在OpenCV中使用calcOpticalFlowPyrLK和calcOpticalFlowFarneback函数进行光流计算的代码演示。
摘要由CSDN通过智能技术生成

基本原理

光流是由物体或照相机的运动引起的两个连续帧之间图像物体的视运动的模式。它是2D向量场,其中每个向量都是位移向量,表示点从第一帧到第二帧的运动。
光流在以下领域具有许多应用: - 运动的结构 - 视频压缩 - 视频稳定…
在这里插入图片描述

稀疏光流KLT

限制: 1. 亮度恒定 2.缓慢移动 3.空间一致性
操作步骤:输入第一帧图片,利用harris特征检测进行特征点检测,通过特征点进行的跟踪。
在这里插入图片描述

稠密光流HF

步骤:不会再去寻找特征点,直接读取两帧图片,然后图片对比,寻找差异,将所有移动的点用多项式表达出来。


#include<opencv2/opencv.hpp>
#include<iostream>
#include <math.h>

using namespace cv;
using namespace std;
void drawOpticalFlowHF(const Mat &flowdata, Mat &image, int step);
int main() 
{
   
	//VideoCapture capture;
	//capture.open("D:/wv_demo.mp4");
	VideoCapture capture(0);
	if (!capture.isOpened()) {
   
		printf("could not find the video");
		return -1;
	}

	Mat frame,gray;
	Mat prev_frame, prev_gray;
	Mat flowResult,flowdata;
	capture.read(frame);
	cvtColor(frame, prev_gray, COLOR_BGR2GRAY);
	namedWindow("flow", WINDOW_AUTOSIZE);
	namedWindow("input", WINDOW_AUTOSIZE);
	//从第二针开始读取
	while(capture.read(frame))
	{
   
		cvtColor(frame,gray,COLOR_BGR2GRAY);
		if (!prev_gray.empty()) 
		{
   
			calcOpticalFlowFarneback(prev_gray, gray, flowdata, 0.5, 3, 15, 3, 5, 1.2, 0);
			cvtColor(prev_gray, flowResult, COLOR_GRAY2BGR);
			drawOpticalFlowHF(flowdata,flowResult,10);
			imshow("flow", flowResult);
			imshow("input", frame);
		}
		
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值