opencv实现运动追踪

简介

  在本篇中,我们分别使用opencv提供的方法:BackgroundSubtractorMOG 和 CvBGCodeBookModel两种方式来实现video的运动跟踪。

BackgroundSubtractorMOG

  在这里,首先要感谢:http://blog.csdn.net/yang_xian521/article/details/6991002 这篇blog的博主,非常感谢该博主,这里使用的实例来源于它。

具体代码

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/video.hpp>
 
#include <iostream>
 
using namespace cv;
using namespace std;
 
int main(int argc, char **argv){
	Mat frame;
	Mat foreground;	// 前景图片
	VideoCapture capture(argv[1]);
 
	if (!capture.isOpened())
	{
		return 0;
	}
 
	namedWindow("Extracted Foreground");
	namedWindow("Source Video");
	// 混合高斯物体
	BackgroundSubtractorMOG mog;
	bool stop(false);
	while (!stop)
	{
		if (!capture.read(frame))
		{
			break;
		}
		// 更新背景图片并且输出前景
		mog(frame, foreground, 0.01);
		// 输出的前景图片并不是2值图片,要处理一下显示
		threshold(foreground, foreground, 128, 255, THRESH_BINARY_INV);
		// show foreground
		imshow("Extracted Foreground", foreground);
		imshow("Source Video", frame);
		if (waitKey(10) == 27)
		{
			stop = true;
		}
	}
}

效果演示

  具体的代码讲解,请看之前提到的那个博客上有详细的描述。
具体效果如下:
                

CvBGCodeBookModel

  这个是实例是有opencv官方提供的实例bgfg_codebook.cpp简化而来。

具体代码

#include "opencv2/core/core.hpp"
#include "opencv2/video/background_segm.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/legacy/legacy.hpp"
 
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
using namespace std;
using namespace cv;
 
CvBGCodeBookModel* model = 0;
const int NCHANNELS = 3;
bool ch[NCHANNELS]={true,true,true}; // This sets what channels should be adjusted for background bounds
 
int main(int argc, const char** argv){
 
    int nframesToLearnBG = <a href="http://www.opengroup.org/onlinepubs/%3Cspan%20class=" nu19"="" style="text-decoration: none; color: rgb(11, 0, 128); background-image: none; background-position: initial initial; background-repeat: initial initial;">009695399/functions/atoi.html">atoi(argv[1]);
    string filename = argv[2];
    IplImage* rawImage = 0, *yuvImage = 0; //yuvImage is for codebook method
    IplImage *ImaskCodeBook = 0,*ImaskCodeBookCC = 0;
    CvCapture* capture = 0;
 
    int c, n, nframes = 0;
 
    model = cvCreateBGCodeBookModel(); //codebook方法中,初始化
 
    //Set color thresholds to default values
    model->modMin[0] = 3;
    model->modMin[1] = model->modMin[2] = 3;
    model->modMax[0] = 10;
    model->modMax[1] = model->modMax[2] = 10;
    model->cbBounds[0] = model->cbBounds[1] = model->cbBounds[2] = 10;
 
    bool pause = false;
    bool singlestep = false;
 
    capture = cvCreateFileCapture( filename.c_str() );
    if( !capture ){
        return -1;
    }
 
    //MAIN PROCESSING LOOP:
    for(;;){
        if(!pause){
            rawImage = cvQueryFrame(capture);
            ++nframes;
            if(!rawImage)
                break;
        }
        if(singlestep)
            pause = true;
 
        //First time:
        if(nframes == 1 && rawImage){
            yuvImage = cvCloneImage(rawImage);
            ImaskCodeBook = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 1 );
            ImaskCodeBookCC = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 1 );
            cvSet(ImaskCodeBook,cvScalar(255));
 
            cvNamedWindow( "Raw", 1 );
            cvNamedWindow( "ForegroundCodeBook",1);
            cvNamedWindow( "CodeBook_ConnectComp",1);
        }
 
        if(rawImage){
            cvCvtColor(rawImage, yuvImage, CV_BGR2YCrCb);//YUV For codebook method
            if(!pause && nframes-1 < nframesToLearnBG)
                cvBGCodeBookUpdate( model, yuvImage ); //codebook方法中,更新背景模型
 
            if(nframes-1 == nframesToLearnBG)
                cvBGCodeBookClearStale( model, model->t/2 ); //清除消极的codebook
 
            if( nframes-1 >= nframesToLearnBG){
                // Find foreground by codebook method
                cvBGCodeBookDiff(model, yuvImage, ImaskCodeBook);//codebook方法中,背景减除
                // This part just to visualize bounding boxes and centers if desired
                cvCopy(ImaskCodeBook,ImaskCodeBookCC);
                cvSegmentFGMask(ImaskCodeBookCC);
            }
            //Display
            cvShowImage("Raw", rawImage);
            cvShowImage("ForegroundCodeBook",ImaskCodeBook);
            cvShowImage("CodeBook_ConnectComp",ImaskCodeBookCC);
        }
 
        // User input:
        c = cvWaitKey(100)&0xFF;
    }
 
    cvReleaseCapture( &capture );
    cvDestroyWindow( "Raw" );
    cvDestroyWindow( "ForegroundCodeBook");
    cvDestroyWindow( "CodeBook_ConnectComp");
    return 0;
}

代码讲解

  1、运行时候需要传入两个参数:(1)背景计算的帧数. (2)使用的video文件。
    int nframesToLearnBG = <a href="http://www.opengroup.org/onlinepubs/%3Cspan%20class=" nu19"="" style="text-decoration: none; color: rgb(11, 0, 128); background-image: none; background-position: initial initial; background-repeat: initial initial;">009695399/functions/atoi.html">atoi(argv[1]);
    string filename = argv[2];
  2、初始化codebook,设置它计算使用的的相关阀值。
    CvBGCodeBookModel* model = 0;
 
    model = cvCreateBGCodeBookModel(); //codebook方法中,初始化
 
    //Set color thresholds to default values
    model->modMin[0] = 3;
    model->modMin[1] = model->modMin[2] = 3;
    model->modMax[0] = 10;
    model->modMax[1] = model->modMax[2] = 10;
    model->cbBounds[0] = model->cbBounds[1] = model->cbBounds[2] = 10;
  3、打开传入的video文件。
    capture = cvCreateFileCapture( filename.c_str() );
    if( !capture ){
        <a href="http://www.opengroup.org/onlinepubs/%3Cspan%20class=" nu19"="" style="text-decoration: none; color: rgb(11, 0, 128); background-image: none; background-position: initial initial; background-repeat: initial initial;">009695399/functions/printf.html">printf( "Can not initialize video capturing\n\n" );
        return -1;
    }
  4、在for的死循环中,不断的从video文件中去出一帧数据。
    rawImage = cvQueryFrame(capture);
    ++nframes;
    if(!rawImage)
        break;
  5、如果是处理第一帧数据,初始化之后会使用的图像:yuvImage ImaskCodeBook ImaskCodeBookCC和创建相关的显示窗口。
if(nframes == 1 && rawImage){
    yuvImage = cvCloneImage(rawImage);
    ImaskCodeBook = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 1 );
    ImaskCodeBookCC = cvCreateImage(cvGetSize(rawImage), IPL_DEPTH_8U, 1 );
    cvSet(ImaskCodeBook,cvScalar(255));
 
    cvNamedWindow( "Raw", 1 );
    cvNamedWindow( "ForegroundCodeBook",1);
    cvNamedWindow( "CodeBook_ConnectComp",1);
}
  6、首先将处理图像转换成yuv,然后如果当前处理的帧数小于之前传入的背景计算帧数,则使用cvBGCodeBookUpdate进行背景模型跟踪。如果当前帧数等于之前传入的背景
计算帧数,则使用cvBGCodeBookClearStale清除消极的codebook,到了这一步就相当于背景部分训练计算完成。
     cvCvtColor(rawImage, yuvImage, CV_BGR2YCrCb);//YUV For codebook method
     if(!pause && nframes-1 < nframesToLearnBG)
          cvBGCodeBookUpdate( model, yuvImage ); //codebook方法中,更新背景模型
 
     if(nframes-1 == nframesToLearnBG)
          cvBGCodeBookClearStale( model, model->t/2 ); //清除消极的codebook
  7、使用cvBGCodeBookDiff来进行背景减除,获得运动部分的图像,保存在ImaskCodeBook中。接着使用cvSegmentFGMask做连通域分割,从而获得更好的运动图像,保存在
ImaskCodeBookCC中。
     if( nframes-1 >= nframesToLearnBG){
          // Find foreground by codebook method
          cvBGCodeBookDiff(model, yuvImage, ImaskCodeBook);//codebook方法中,背景减除
          // This part just to visualize bounding boxes and centers if desired
          cvCopy(ImaskCodeBook,ImaskCodeBookCC);
          cvSegmentFGMask(ImaskCodeBookCC);
      }
  8、最后将原始图像(rawImage)、背景减去之后图像(ImaskCodeBook)和连通域分割后图像(ImaskCodeBookCC)分别显示出来。
     //Display
     cvShowImage("Raw", rawImage);
     cvShowImage("ForegroundCodeBook",ImaskCodeBook);
     cvShowImage("CodeBook_ConnectComp",ImaskCodeBookCC);

效果演示

  最后对应的效果演示如下:
                                    原始图像                                                                   
                          
                                  背景减去之后图像
                           
                                 连通域分割后图像
                       
                            
时间: 2024-08-01 18:52:50

opencv实现运动追踪的相关文章

opencv实现运动追踪(2)

简介 本篇继续讲解opencv上使用BackgroundSubtractorGMG,进行运动物体跟踪,并将跟踪到运动物体用圆框选起来.本篇是基于opecncv官方实例: bgfg_gmg.cpp,进行讲解和修改. BackgroundSubtractorGMG使用 具体代码 #include <opencv2/opencv.hpp> #include <iostream> #include "opencv2/core/core.hpp" #include &qu

【图像处理】openCV光流法追踪运动物体

openCV光流法追踪运动物体 email:[email protected] 一.光流简单介绍 摘自:zouxy09 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的相应关系.从而计算出相邻帧之间物体的运动信息的一种方法.一般而言,光流是因为场景中前景目标本身的移动.相机的运动,或者两者的共同运动所产生的. 研究光流场的目的就是为了从图片序列中近似得到

Opencv实时眼球追踪,解脱的你双手,让你的眼睛写代码!

Opencv实时眼球追踪,让你的眼睛写代码!这个还是有点对于我现在的追踪效果,还有点距离,但是我想完成这个还是没有问题的,用眼睛去控制电脑打字.我认为只要用手可以做,用眼睛都可以做到,包括游戏.画画.写字等等! 废话不多说,目前追踪率82.5%-98%(戴眼镜和不戴眼镜),目前这个是第一个版本,只是基本上实现了眼球追踪,后面会加上GPU处理提高效率,将目前的face分类器,增加face特征算法以提高face查准率!使实时眼球追踪更加稳定,效率更高,追踪率更高稳定些,适应更多场景!给两个视频连接和

Google Tango Java SDK开发:Motion Tracking 运动追踪

Java API Motion Tracking Tutorial运动追踪教程 This page describes how the Java API handles motion tracking. 该页面描述了如何使用Java API处理运动追踪. Lifecycle 生命周期 The normal motion tracking system lifecycle consists of three states: TangoPoseData.POSE_INITIALIZING, Tang

Python黑科技:50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识

嗨,我最亲爱的伙计们,很高兴我们又见面了. 首先先感谢朋友们的关注.当然我更希望认识与计算机相关的领域的朋友咱们一起探讨交流.重点说一下,我是真人,不是那些扒文章的自媒体组织,大家可以相互交流的! 本篇文章我们来讲一下关于AI相关的人脸追踪,人脸识别相关的一些知识.当然本篇教程为(上)部分,讲一下利用python+opencv来实现人脸识别与追踪,明后天出(下)部分,用python来通过指纹对比实现人脸验证.人脸解锁(大家感兴趣的可以提前关注哦). 这两节课呢,代码量都不是很多,鄙人尽量多注释点

WIFI实时监控追踪小车演示视频——安卓端、小车

文章由@超人爱因斯坦出品,转载请注明出处.         文章链接:          http://hpw123.net/a/qingsongyike/yingyinqu/2014/1019/59.html 作者:超人爱因斯坦    个人站点:http://www.hpw123.net 邮箱: [email protected] CSDN:http://blog.csdn.net/u010283694 本项目是将安卓技术.嵌入式技术.无线通信技术等相关技术应用到视频监控系统中,可实现视频监控

2017黑科技趋势最具看点的十大新品

腾讯数码讯(Human)作为一年一度的全球消费电子市场风向标,今年同样在拉斯维加斯举办的CES 2017消费电子展,依然吸引了一大批全球各个领域的厂商参展,从科技巨头到初创小团队.从传统汽车厂商再到家电企业,似乎所有能与科技沾边的公司都希望能在CES 2017上好好展示一次自己的风采. 其实每年的CES都有一些明星产品给我们留下深刻的印象,今年的也不例外.而这些明星产品不仅仅只是单单一款产品,更是代表了各自行业在进入到2017年之后的一个发展趋势和方向.而就将这样的变化能否成为未来的主流.或只是

Google帝国研究——Google的产业构成

                                                                                    Google帝国研究--Google的产业构成 摘要:Google帝国研究  产业构成 作者:魏春颖 文章来源:网络整理 Google产业的构成: 1.    业务板块: 包括互联网搜索.云计算.广告技术,开发并提供大量基于互联网的产品与服务,开发线上软件.应用软件,还涉及移动设备的Android操作系统以及操作系统谷歌Chrom

交互能力的提升

随着电 脑科技的进步,影像呈现的精致程度和效率都大幅提升,全景拍摄/剪接技术也更成熟了. 动作捕捉和空间定位技术也丰富了 VR /AR内容的互动性. 伴随着VR的交互式叙事方式带来的视觉.触觉.听觉.味觉.嗅觉等多元互动体验是前所未有的. VR 的诞生将颠覆人类与计算机交互的方式. 在VR的交互体验方面,除了VR设备提供准确的运动跟踪数据之外.在VR软件中还需要分析一段时间内的运动数据,并与标准的动作模式进行匹配,来理解用户的操作意图. ***  << 听觉相关技术 >>  ***