calcOpticalFlowPyrLK()光流法找特征点

#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>
#include<string>
#include<opencv.hpp>

using namespace cv;
using namespace std;

int main() {

	
	int maxCount = 50;//最大特征点数
	double minDis = 20;//:对于初选出的角点而言,如果
	//在其周围minDis范围内存在其他更强角点,则将此角点删除
	double qLevel = 0.01;//角点的品质因子

	string filename = "result0.avi";
	VideoCapture cap(filename);

	Mat pre, cur;
	Mat pre_gray, cur_gray;
	vector<uchar> status;
	vector<float> err;
	cap >> pre;
	
	cvNamedWindow("cur", CV_WINDOW_NORMAL);
	while (cap.read(cur)) {
		vector<Point2f>pre_points, cur_points;//保存检测出的角点
		cvtColor(pre, pre_gray, CV_RGB2GRAY);
		goodFeaturesToTrack(pre_gray, pre_points, maxCount, qLevel, minDis);//角点识别

		calcOpticalFlowPyrLK(pre, cur, pre_points, cur_points, status, err);//LK金字塔  
		int tr_num = 0;

		for (int i = 0; i < status.size(); i++)
		{
			if (status[i] == 1)
				tr_num++;
		}
		if (tr_num < 6) {//由于是仿射变换,有六个自由度,需要六对特征点解六个方程组
			cout << "you need to change the feat-img because the background-img was all changed" << endl;
			getchar();
			return -1;
		}

		for (int i = 0; i < cur_points.size(); i++)
		{
			circle(cur, cur_points[i], 3, Scalar(0, 255, 0), 2);
			line(cur, pre_points[i], cur_points[i], Scalar(255, 0, 0), 2);//画出两帧之间的光流变化
		}
		
		imshow("cur", cur);
		waitKey(10);

		//pre_points = cur_points;
		pre = cur.clone();//不能用 pre = cur,这是浅拷贝

	}

	waitKey(0);
	return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_32095699/article/details/81007246