`

OpenCV 使用光流法检测物体运动

 
阅读更多

OpenCV 可以使用光流法检测物体运动,贴上代码以及效果。

 

// opticalflow.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


// Example 10-1. Pyramid Lucas-Kanade optical flow code
//
/* *************** License:**************************
   Oct. 3, 2008
   Right to use this code in any way you want without warrenty, support or any guarentee of it working.

   BOOK: It would be nice if you cited it:
   Learning OpenCV: Computer Vision with the OpenCV Library
     by Gary Bradski and Adrian Kaehler
     Published by O'Reilly Media, October 3, 2008
 
   AVAILABLE AT: 
     http://www.amazon.com/Learning-OpenCV-Computer-Vision-Library/dp/0596516134
     Or: http://oreilly.com/catalog/9780596516130/
     ISBN-10: 0596516134 or: ISBN-13: 978-0596516130    

   OTHER OPENCV SITES:
   * The source code is on sourceforge at:
     http://sourceforge.net/projects/opencvlibrary/
   * The OpenCV wiki page (As of Oct 1, 2008 this is down for changing over servers, but should come back):
     http://opencvlibrary.sourceforge.net/
   * An active user group is at:
     http://tech.groups.yahoo.com/group/OpenCV/
   * The minutes of weekly OpenCV development meetings are at:
     http://pr.willowgarage.com/wiki/OpenCV
   ************************************************** */

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <stdio.h>

const int MAX_CORNERS = 500;
int main(int argc, char** argv) {
   // Initialize, load two images from the file system, and
   // allocate the images and other structures we will need for
   // results.
	//
	IplImage* imgA = cvLoadImage("OpticalFlow0.jpg",CV_LOAD_IMAGE_GRAYSCALE);
	IplImage* imgB = cvLoadImage("OpticalFlow1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
	CvSize      img_sz    = cvGetSize( imgA );
	int         win_size = 10;
	IplImage* imgC = cvLoadImage("OpticalFlow1.jpg",CV_LOAD_IMAGE_UNCHANGED);
	
	// The first thing we need to do is get the features
	// we want to track.
	//
	IplImage* eig_image = cvCreateImage( img_sz, IPL_DEPTH_32F, 1 );
	IplImage* tmp_image = cvCreateImage( img_sz, IPL_DEPTH_32F, 1 );
	int              corner_count = MAX_CORNERS;
	CvPoint2D32f* cornersA        = new CvPoint2D32f[ MAX_CORNERS ];
	cvGoodFeaturesToTrack(
		imgA,
		eig_image,
		tmp_image,
		cornersA,
		&corner_count,
		0.01,
		5.0,
		0,
		3,
		0,
		0.04
	);
	cvFindCornerSubPix(
		imgA,
		cornersA,
		corner_count,
		cvSize(win_size,win_size),
		cvSize(-1,-1),
		cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03)
	);
	// Call the Lucas Kanade algorithm
	//
	char features_found[ MAX_CORNERS ];
	float feature_errors[ MAX_CORNERS ];
	CvSize pyr_sz = cvSize( imgA->width+8, imgB->height/3 );
	IplImage* pyrA = cvCreateImage( pyr_sz, IPL_DEPTH_32F, 1 );
  IplImage* pyrB = cvCreateImage( pyr_sz, IPL_DEPTH_32F, 1 );
  CvPoint2D32f* cornersB        = new CvPoint2D32f[ MAX_CORNERS ];
  cvCalcOpticalFlowPyrLK(
     imgA,
     imgB,
     pyrA,
     pyrB,
     cornersA,
     cornersB,
     corner_count,
     cvSize( win_size,win_size ),
     5,
     features_found,
     feature_errors,
     cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3 ),
     0
  );
  // Now make some image of what we are looking at:
  //
  for( int i=0; i<corner_count; i++ ) {
     if( features_found[i]==0|| feature_errors[i]>550 ) {
 //       printf("Error is %f/n",feature_errors[i]);
        continue;
     }
 //    printf("Got it/n");
     CvPoint p0 = cvPoint(
        cvRound( cornersA[i].x ),
        cvRound( cornersA[i].y )
     );
     CvPoint p1 = cvPoint(
        cvRound( cornersB[i].x ),
        cvRound( cornersB[i].y )
     );
     cvLine( imgC, p0, p1, CV_RGB(255,0,0),2 );
  }
  cvNamedWindow("ImageA",0);
  cvNamedWindow("ImageB",0);
  cvNamedWindow("LKpyr_OpticalFlow",0);
  cvShowImage("ImageA",imgA);
  cvShowImage("ImageB",imgB);
  cvShowImage("LKpyr_OpticalFlow",imgC);
  cvWaitKey(0);
  return 0;
}



两张测试图片:

 

OpticalFlow0.jpg

OpticalFlow1.jpg

运行结果:

分享到:
评论

相关推荐

    光流法运动检测代码C++,opencv

    本项目提供了C++实现的光流法运动检测代码,结合了OpenCV库的强大功能。 首先,我们要理解光流的基本概念。光流是基于图像亮度恒定假设(即亮度不变性)的,认为图像中每个像素的亮度在连续帧之间不会改变。通过...

    基于opencv的光流法

    光流法是一种在连续两帧图像之间估计物体运动的方法。它通过分析图像序列中的像素强度变化来计算每个像素的瞬时速度。光流法广泛应用于计算机视觉领域,如运动检测、目标跟踪等场景。在本示例中,使用了OpenCV库来...

    Opencv光流运动物体追踪详解

    通过Opencv中金字塔LK光流的实现,可以实现图像跟踪、物体追踪等功能,例如,追踪视频流中的物体运动、图像跟踪结果等。 四、Opencv光流运动物体追踪的应用 Opencv光流运动物体追踪的应用非常广泛,例如,在计算机...

    opencv光流法车辆检测源码

    光流法是一种在连续视频序列中估计物体运动的技术,它基于图像像素级别的运动信息。在计算机视觉领域,光流法广泛应用于目标跟踪、运动分析、车辆检测等多个场景。本资源包含了一个利用OpenCV库实现的光流法车辆检测...

    OpenCV光流法

    4. 光流的应用:光流法广泛应用于多个领域,包括视频分析、运动跟踪、目标检测、增强现实等。例如,通过追踪连续帧中的特定特征点,可以实现稳定的运动物体跟踪;在自动驾驶中,光流可以帮助理解车辆周围的环境变化...

    Opencv3.0之【9】用光流法进行运动目标检测.rar

    在OpenCV 3.0版本中,光流法是一种常用的技术,用于追踪图像序列中的运动物体。本教程主要探讨如何利用光流法在OpenCV中实现运动目标检测。 光流法是一种估计像素级运动的方法,基于相邻帧之间像素亮度恒定的假设。...

    光流法检测运动目标

    在“光流法检测运动目标”的场景中,我们主要关注如何通过稀疏LK(Lucas-Kanade)光流法来实现这一功能。Lucas-Kanade方法是一种基于迭代优化的光流算法,由Lucas和Kanade在1981年提出。它假设图像局部像素的运动是...

    打开摄像头用光流法对运动物体检测估计

    在"打开摄像头用光流法对运动物体检测估计"的项目中,我们主要关注如何利用光流法来捕捉和分析摄像头捕获的连续图像中的运动信息。首先,我们需要获取摄像头的视频流,这通常通过编程接口如OpenCV来实现,OpenCV是一...

    光流法opencv实现

    本教程将详细介绍如何利用OpenCV实现光流法进行目标运动检测。 首先,我们需要理解光流的基本概念。光流是连续两帧图像中像素的运动矢量,它假设图像亮度恒定,即同一物体在不同时间的观察中亮度不变。基于这个假设...

    python简单LK稀疏光流法运动目标检测

    总的来说,Python的简单LK稀疏光流法是运动目标检测的一种实用工具,尤其适用于资源有限的环境。MATLAB则提供了另一种实现方式,尽管通常更适用于研究和原型设计。无论使用哪种语言,理解和掌握光流算法的基本原理都...

    opencv 运动物体跟踪检测

    5. **物体跟踪**:检测到运动物体后,可以使用OpenCV的跟踪算法,如卡尔曼滤波器、光流法、CamShift等,持续追踪物体在后续帧中的位置。 三、OpenCV中的关键函数 1. `cv::createBackgroundSubtractor`:创建一个...

    OPENCV目标跟踪基于光流法的运动目标检测源代码

    在本段提供的信息中,描述了使用OpenCV实现的目标跟踪技术,特别是基于光流法的运动目标检测源代码。光流法是一种基于图像序列的时间连续性原理,通过计算连续帧之间的像素强度变化来推断目标的运动。在视频处理中,...

    opencv运动物体检测

    OpenCV(开源计算机视觉库)是一个强大的工具,用于处理图像和视频数据,其中包括运动物体的检测。在视频分析中,运动物体检测是一项关键任务,它能够帮助我们识别和跟踪画面中移动的物体,从而实现诸如智能监控、...

    C++OpenCV3源代码用光流法进行运动目标检测

    在本篇内容中,我们将基于提供的标题:“C++OpenCV3源代码用光流法进行运动目标检测”、描述以及部分上下文信息,深入探讨如何使用C++与OpenCV库来实现基于光流法的运动目标检测技术。该技术广泛应用于计算机视觉...

    OpenCVSharp移动物体检测.zip

    3. **光流法**:光流描述了图像中像素随时间的运动,是另一种识别运动物体的方法。OpenCVSharp提供了Lucas-Kanade光流算法,它能计算像素级的运动信息,适合处理快速运动或小物体的情况。 4. **轮廓检测与跟踪**:...

    optical_flow_光流法_光流法计算特征点匹配_光流_

    光流法是计算机视觉领域中的一个关键概念,用于分析连续两帧图像中像素的运动信息。这个技术在视频处理、自动驾驶、无人机导航、虚拟现实等多个领域有着广泛应用。本文将深入探讨光流法的基本原理、计算方法以及在...

    KLT光流法目标跟踪的OpenCV源码实现

    KLT(Kanade-Lucas-Tomasi)光流法是一种经典的目标跟踪算法,它利用相邻帧之间的像素运动信息来估计物体的运动。在本主题中,我们将深入探讨KLT光流法及其在OpenCV库中的实现。 首先,KLT光流法的核心思想是假设...

    光流法检测目标

    以下是使用Python和OpenCV实现光流法目标检测的一个简单示例: ```python import cv2 import numpy as np # 初始化 prev_frame = None flow = None # 加载视频 cap = cv2.VideoCapture('video.mp4') while cap....

Global site tag (gtag.js) - Google Analytics