在本篇博客中一并使用了OpenCV读取摄像头,读取视频等操作,通过光流法,实现目标检测.含义有自己写的代码和官方的代码,实现的方法不尽相同
主要使用如下几个函数:具体使用和注解,看下面代码,
goodFeaturesToTrack
确定图像上的强角点。
cornerSubPix
精确角点的位置。
calcOpticalFlowPyrLK
使用具有金字塔的迭代Lucas-Kanade方法计算稀疏特征集的光流。
#include "opencv/cv.h"
#include "opencv/cxcore.h"
#include "opencv/highgui.h"
#include <iostream>
using namespace std;
using namespace cv;
/* 全局变量 */
namespace{
const int MAX_CORNERS = 1000;
int WIN_SIZE = 5;
}
/* 文件路径 */
namespace{
// const char* InputVideoPath = "../image/test.mp4";
}
int main()
{
// 读取视频数据
// CvCapture* capture = cvCaptureFromAVI(InputVideoPath);
// 摄像头数据
CvCapture* capture = cvCreateCameraCapture(0);
// 放置视频当前帧的图片
IplImage* imgSrc = cvQueryFrame(capture);
if(!capture){
fprintf(stderr, "Cannot open video!\n");
return -1;
}
// 设置帧的大小
CvSize sizeImg = cvGetSize(imgSrc);
// 灰度图
IplImage* imgGray = cvCreateImage( sizeImg, IPL_DEPTH_8U, 1 );
IplImage* imgCurr = cvCreateImage( sizeImg, IPL_DEPTH_8U, 1 );
// 光流显示
IplImage* imgDisplay = cvCreateImage( sizeImg, IPL_DEPTH_8U, 3 );
IplImage* imgDisplay1 = cvCreateImage( sizeImg, IPL_DEPTH_8U, 3 );
IplImage* imgDisplay2 = cvCreateImage( sizeImg, IPL_DEPTH_8U, 3 );
// 金字塔图像的缓冲区
CvSize sizePyr = cvSize( imgSrc->width + 8, imgSrc->height / 3 );
IplImage* pyrPrev = cvCreateImage( sizePyr, IPL_DEPTH_32F, 1 );
IplImage* pyrCurr = cvCreateImage( sizePyr, IPL_DEPTH_32F, 1 );
CvPoint2D32f* featuresPrev = new CvPoint2D32f[ MAX_CORNERS ];
CvPoint2D32f* featuresCurr = new CvPoint2D32f[ MAX_CORNERS ];
CvSize sizeWin = cvSize( WIN_SIZE, WIN