#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;
}
calcOpticalFlowPyrLK()光流法找特征点
猜你喜欢
转载自blog.csdn.net/qq_32095699/article/details/81007246
今日推荐
周排行