OpenCV下的Lucas-Kanade算法:运动分析和目标跟踪

在本篇博客中一并使用了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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值