资源简介
基于opencv实现,包括特征检测,光流法,图像金字塔实现大运动跟踪
代码片段和文件信息
#include “opencv2/opencv.hpp“
#include
#include
using namespace std;
using namespace cv;
class frameProcessor;
//帧处理基类
class frameProcessor{
public:
virtual void process(Mat &inputMat &ouput)=0;
};
//特征跟踪类,继承自帧处理基类
class FeatureTracker : public frameProcessor{
Mat gray; //当前灰度图
Mat gray_prev; //之前的灰度图
vector points[2];//前后两帧的特征点
vector initial;//初始特征点
vector features;//检测到的特征
int max_count; //要跟踪特征的最大数目
double qlevel; //特征检测的指标
double minDist;//特征点之间最小容忍距离
vector status; //特征跟踪状态
vector err; //跟踪时的错误
public:
FeatureTracker():max_count(500)qlevel(0.01)minDist(10.){}
void process(Mat &frameMat &output){
//得到灰度图
cvtColor (framegrayCV_BGR2GRAY);
frame.copyTo (output);
//特征点太少了,重新检测特征点
if(addNewPoint()){
detectFeaturePoint ();
//插入检测到的特征点
points[0].insert (points[0].end ()features.begin ()features.end ());
initial.insert (initial.end ()features.begin ()features.end ());
}
//第一帧
if(gray_prev.empty ()){
gray.copyTo (gray_prev);
}
//根据前后两帧灰度图估计前一帧特征点在当前帧的位置
//默认窗口是15*15
calcOpticalFlowPyrLK (
gray_prev//前一帧灰度图
gray//当前帧灰度图
points[0]//前一帧特征点位置
points[1]//当前帧特征点位置
status//特征点被成功跟踪的标志
err);//前一帧特征点点小区域和当前特征点小区域间的差,根据差的大小可删除那些运动变化剧烈的点
int k = 0;
//去除那些未移动的特征点
for(int i=0;i if(acceptTrackedPoint (i)){
initial[k]=initial[i];
points[1][k++] = points[1][i];
}
}
points[1].resize (k);
initial.resize (k);
//标记被跟踪的特征点
handleTrackedPoint (frameoutput);
//为下一帧跟踪初始化特征点集和灰度图像
std::swap(points[1]points[0]);
cv::swap(gray_prevgray);
}
void detectFeaturePoint(){
goodFeaturesToTrack (gray//图片
features//输出特征点
max_count//特征点最大数目
qlevel//质量指标
minDist);//最小容忍距离
}
bool addNewPoint(){
//若特征点数目少于10,则决定添加特征点
return points[0].size ()<=10;
}
//若特征点在前后两帧移动了,则认为该点是目标点,且可被跟踪
bool acceptTrackedPoint(int i){
return status[i]&&
(abs(points[0][i].x-points[1][i].x)+
abs(points[0][i].y-points[1][i].y) >2);
}
//画特征点
void handleTrackedPoint(Mat &frameMat &output){
for(int i=0;i //当前特征点到初始位置用直线表示
line(outputinitial[i]points[1][i]Scalar::all (0));
//当前位置用圈标出
circle(outputpoints[1][i]3Scalar::all(0)(-1));
}
}
};
class VideoProcessor{
private:
VideoCapture caputure
- 上一篇:数字图像处理扑克牌识别程序
- 下一篇:剑灵辅助源码
相关资源
- OpenCV打开摄像机显示在MFC窗口工程源
- 使用c++读取图像到二维矩阵
- 三维点云的圆柱面拟合
- MFC+OPENCV摄像机标定程序
- 基于特征脸的人脸识别MFC+OpenCV
- opencv图像处理MFC
- OPENCV人脸检测加角点检测并输出坐标
- FillHole.rar
- 道路提取算法 c++ opencv
- PCA代码实现详解
- opencv卡尔曼滤波
- SeamCarving opencv c++
- opencv prewitt边缘检测
- MFC中使用OpenCV显示选定文件夹中所有
- 车牌识别系统和车型识别系统源代码
- opencv 模糊C均值 c++
- 基于opencv的图像配准程序
- VC++直方图均衡化显示图像及直方图
- Opencv+VC6.0实现摄像头视频的监控
- opencv入门教程(C++版)
- 简单的几何图形识别程序源代码
- 虹膜分割 Iris Segmentation C++和opencv实现
- C++(OPENCV)摄像头标定代码带图片O
- 基于Opencv的交通流量实时检测
- 棋盘格标定图
- opencv视觉定位,C++编写的
- opencv循迹
- 任意曲线(S型等)调整图像色调,对
- Visual C++利用OpenCV对图像进行人脸识别
- 运用opencv的c++图像单点相关系数匹配
评论
共有 条评论