opencv:光流估计 L-K

cv::goodFeaturesToTrack(),它不仅支持Harris角点检测,也支持Shi Tomasi算法的角点检测

void goodFeaturesToTrack(
		// 输入图像(CV_8UC1 CV_32FC1)
		InputArray image, 
		/*
		检测到的所有角点,类型为vector或数组,由实际给定的参数类型而定。
		如果是vector,那么它应该是一个包含cv::Point2f的vector对象;
		如果类型是cv::Mat,那么它的每一行对应一个角点,点的x、y位置分别是两列
		*/
		OutputArray corner,
		/*
		规定的特征点最大数目
		比如一副图像你可以找到很多特征点,但是只是取前maxCorners个具有最大特征的那些点作为最后的特征点。
		opencv自有一个机制,随便一个方法,比如计算一下这个点与周围一定领域的点的灰度相差求和,认为这个和越大的那些点是不是越属于特征点。
		*/
		int maxCorners,
		// 质量水平系数(小于1.0的正数,一般在0.01-0.1之间)
		double qualityLevel, 
		// 用于区分相邻两个角点的最小距离(小于这个距离的点将进行合并)
		double minDistance, 
		// 如果指定,它的维度必须和输入图像一致,且在mask=0的点忽略
		InputArray mask = noArray(), 
		/*
		表示在计算角点时参与运算的区域大小,常用值为3,
		但是如果图像的分辨率较高则可以考虑使用较大一点的值。
		*/
		int blockSIze = 3,
		// false='Shi Tomasi metric'
		bool useHarrisDetector = false, 
		// Harris角点检测时用,最好使用默认值0.04
		double k = 0.04 
	)

calcOpticalFlowPyrLK函数

C++: void calcOpticalFlowPyrLK(InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray nextPts, OutputArray status, OutputArray err, Size winSize=Size(15,15), int maxLevel=3, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), double derivLambda=0.5, int flags=0 )

参数:

prevImg:就是你需要输入计算光流的前一帧图像

nextImg就是下一帧图像(可以看到一次光流就是在两针图像之间找不同)。

prevPts是前一帧图像中的特征点,这个特征点必须自己去找,所以在使用calcOpticalFlowPyrLK函数的时候,前面需要有一个找特征点的操作,那么一般就是找图像的角点

nextPts参数就是计算特征点在第二幅图像中的新的位置,然后输出。特征点的新位置可能变化了,也可能没有变化,那么这种状态就存放在后一个参数status中。err就是新旧两个特征点位置的误差了,也是一个输出矩阵。

其他参数默认吧。

具体实现

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>

using namespace std;
using namespace cv;

void main()
{
	const char* fn = "D:\\vs-projects\\moving\\vtest.avi";
	VideoCapture cap;
	//lastgray,gray对应上一帧和本帧灰度图
	Mat source, result, gray, lastgray;
	//对应上一帧和本帧的特征点,上一帧是给定的,本帧是预测结果
	vector<Point2f> points[2], temp;
	//每一特征点检测状态
	vector<uchar> status;
	//每一特征点计算误差
	vector<float> err;

	//打开视频
	cap.open(fn);
	if (!cap.isOpened())
	{
		cout << "无法打开视频文件:" << fn << endl;
		return;
	}

	for (;;)
	{
		cap >> source;
		if (source.empty())
			break;

		cvtColor(source, gray, COLOR_BGR2GRAY);
		//点数太少,重新检测特征点
		if (points[0].size() < 10)
		{
			// 角点检测,默认使用Shi-Tomasi角点检测
			goodFeaturesToTrack(gray, points[0], 200, 0.01, 20);
		}

		if (lastgray.empty())
		{
			gray.copyTo(lastgray);
		}

		//计算光流
		calcOpticalFlowPyrLK(lastgray, gray, points[0], points[1], status, err);

		//删除误判点
		int counter = 0;
		for (int i = 0; i < points[1].size(); i++)
		{
			// 距离
			double dist = norm(points[1][i] - points[0][i]);
			if (status[i] && dist >= 2.0 && dist <= 20.0)
			{
				points[0][counter] = points[0][i];
				points[1][counter++] = points[1][i];
			}
		}

		points[0].resize(counter);
		points[1].resize(counter);

		//显示特征点和运动轨迹
		source.copyTo(result);
		for (int i = 0; i < points[1].size(); i++)
		{
			line(result, points[0][i], points[1][i], Scalar(0, 0, 0xff));
			circle(result, points[1][i], 3, Scalar(0, 0xff, 0));
		}

		// 调换
		swap(points[0], points[1]);
		swap(lastgray, gray);

		imshow("源图像", source);
		imshow("检测结果", result);
		//以下检测是否终止(按下ESC终止,对应ASCII 27)
		char key = waitKey(100);
		if (key == 27)
		{
			break;
		}
	}
}

在这里插入图片描述

参考资料:
【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解
目标检测光流法(二):opencv下的光流L-K算法
Opencv学习笔记(九)光流法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
opencv-4.4.0-vc14_vc15.exe 版本:4.4.0 2020年7月 OpenCV 4.x的夏季更新已发布 :晴天: 此版本的亮点: SIFT(尺度不变特征变换)算法已移至主存储库(SIFT的专利已过期) DNN模块: 改进的图层/激活/支持更多模型: 最新的Yolo v4检测器:#17148。为[yolo]层(Yolo v3和Yolo v4)禁用了每层NMS,因为它们是不正确的-用于cv::dnn::NMSBoxes所有检测。 ONNX:添加对Resnet_backbone(Torchvision)的支持#16887 EfficientDet模型支持:#17384 新样本/演示: 添加文本识别示例:C ++ / Python FlowNet2光流:#16575 英特尔®推理引擎后端(OpenVINO™): 增加了对OpenVINO 2020.3 LTS / 2020.4版本的支持 计划在下一版本中删除对NN Builder API的支持 CUDA后端中的许多修复和优化(感谢@YashasSamaga):PR G-API模块: 在OpenCV后端引入了用于状态内核的新API :GAPI_OCV_KERNEL_ST。有状态内核在各个图执行(标准中更多)或流的视频帧之间(以流模式)保留其状态。 在G-API推出更多面向视频的操作:goodFeaturesToTrack,buildOpticalFlowPyramid,calcOpicalFlowPyrLK。 添加了更多的图像处理内核:Laplacian和双边过滤器。 修复了G-API的OpenCL后端中的潜在崩溃。 OpenCV社区的许多其他伟大贡献,包括但不限于: Obj-C / Swift绑定:#17165 (opencv_contrib)Julia绑定是正在进行的GSoC项目的一部分:#2547 (opencv_contrib)BIMEF:生物启发的多重曝光融合框架,用于弱光图像增强: #2448 为CV_16UC1图像启用Otsu阈值:#16640 为文本检测添加笔划宽度变换算法:#2464 计划在Apache 2许可证上进行下一版本OE-32的 迁移#17491
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值