2013-04-13 16:59:47 +02:00
|
|
|
// --------------------------------- OpenCV license.txt ---------------------------
|
2014-05-22 16:23:41 +02:00
|
|
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
2013-04-13 16:59:47 +02:00
|
|
|
//
|
|
|
|
// By downloading, copying, installing or using the software you agree to this license.
|
|
|
|
// If you do not agree to this license, do not download, install,
|
|
|
|
// copy or use the software.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// License Agreement
|
|
|
|
// For Open Source Computer Vision Library
|
|
|
|
//
|
|
|
|
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
|
|
|
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
|
|
|
// Third party copyrights are property of their respective owners.
|
|
|
|
//
|
|
|
|
// Redistribution and use in source and binary forms, with or without modification,
|
|
|
|
// are permitted provided that the following conditions are met:
|
|
|
|
//
|
|
|
|
// * Redistribution's of source code must retain the above copyright notice,
|
|
|
|
// this list of conditions and the following disclaimer.
|
|
|
|
//
|
|
|
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
|
|
|
// this list of conditions and the following disclaimer in the documentation
|
|
|
|
// and/or other materials provided with the distribution.
|
|
|
|
//
|
|
|
|
// * The name of the copyright holders may not be used to endorse or promote products
|
|
|
|
// derived from this software without specific prior written permission.
|
|
|
|
//
|
|
|
|
// This software is provided by the copyright holders and contributors "as is" and
|
|
|
|
// any express or implied warranties, including, but not limited to, the implied
|
|
|
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
|
|
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
|
|
|
// indirect, incidental, special, exemplary, or consequential damages
|
|
|
|
// (including, but not limited to, procurement of substitute goods or services;
|
|
|
|
// loss of use, data, or profits; or business interruption) however caused
|
|
|
|
// and on any theory of liability, whether in contract, strict liability,
|
|
|
|
// or tort (including negligence or otherwise) arising in any way out of
|
2014-05-22 16:23:41 +02:00
|
|
|
// the use of this software, even if advised of the possibility of such damage.
|
2013-04-13 16:59:47 +02:00
|
|
|
|
2014-05-22 16:23:41 +02:00
|
|
|
//**************************************************************************************************
|
2013-04-13 16:59:47 +02:00
|
|
|
// Project Delphi-OpenCV
|
|
|
|
// **************************************************************************************************
|
|
|
|
// Contributor:
|
2014-05-22 16:23:41 +02:00
|
|
|
// Laentir Valetov
|
2013-04-13 16:59:47 +02:00
|
|
|
// email:laex@bk.ru
|
2014-05-22 08:53:48 +02:00
|
|
|
// Mikhail Grigorev
|
|
|
|
// email:sleuthound@gmail.com
|
2013-04-13 16:59:47 +02:00
|
|
|
// **************************************************************************************************
|
|
|
|
// You may retrieve the latest version of this file at the GitHub,
|
|
|
|
// located at git://github.com/Laex/Delphi-OpenCV.git
|
|
|
|
// **************************************************************************************************
|
|
|
|
// License:
|
|
|
|
// The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License. You may obtain a copy of the
|
|
|
|
// License at http://www.mozilla.org/MPL/
|
|
|
|
//
|
|
|
|
// Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
|
|
|
|
// ANY KIND, either express or implied. See the License for the specific language governing rights
|
|
|
|
// and limitations under the License.
|
|
|
|
//
|
|
|
|
// Alternatively, the contents of this file may be used under the terms of the
|
|
|
|
// GNU Lesser General Public License (the "LGPL License"), in which case the
|
|
|
|
// provisions of the LGPL License are applicable instead of those above.
|
|
|
|
// If you wish to allow use of your version of this file only under the terms
|
|
|
|
// of the LGPL License and not to allow others to use your version of this file
|
|
|
|
// under the MPL, indicate your decision by deleting the provisions above and
|
|
|
|
// replace them with the notice and other provisions required by the LGPL
|
|
|
|
// License. If you do not delete the provisions above, a recipient may use
|
|
|
|
// your version of this file under either the MPL or the LGPL License.
|
|
|
|
//
|
|
|
|
// For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html
|
|
|
|
// **************************************************************************************************
|
|
|
|
// Warning: Using Delphi XE3 syntax!
|
|
|
|
// **************************************************************************************************
|
|
|
|
// The Initial Developer of the Original Code:
|
|
|
|
// OpenCV: open source computer vision library
|
2014-05-22 16:23:41 +02:00
|
|
|
// Homepage: http://ocv.org
|
|
|
|
// Online docs: http://docs.ocv.org
|
|
|
|
// Q&A forum: http://answers.ocv.org
|
|
|
|
// Dev zone: http://code.ocv.org
|
2013-04-13 16:59:47 +02:00
|
|
|
// **************************************************************************************************
|
|
|
|
// Original file:
|
|
|
|
// opencv\modules\video\include\opencv2\video\tracking_c.h
|
2014-05-22 16:23:41 +02:00
|
|
|
// *************************************************************************************************
|
2013-04-13 16:59:47 +02:00
|
|
|
|
|
|
|
{$IFDEF DEBUG}
|
|
|
|
{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O-,P+,Q+,R+,S-,T-,U-,V+,W+,X+,Y+,Z1}
|
|
|
|
{$ELSE}
|
|
|
|
{$A8,B-,C-,D-,E-,F-,G+,H+,I+,J-,K-,L-,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y-,Z1}
|
|
|
|
{$ENDIF}
|
|
|
|
{$WARN SYMBOL_DEPRECATED OFF}
|
|
|
|
{$WARN SYMBOL_PLATFORM OFF}
|
|
|
|
{$WARN UNIT_PLATFORM OFF}
|
|
|
|
{$WARN UNSAFE_TYPE OFF}
|
|
|
|
{$WARN UNSAFE_CODE OFF}
|
|
|
|
{$WARN UNSAFE_CAST OFF}
|
2014-05-22 16:23:41 +02:00
|
|
|
unit ocv.tracking_c;
|
2013-04-13 16:59:47 +02:00
|
|
|
|
|
|
|
interface
|
|
|
|
|
2014-05-22 16:23:41 +02:00
|
|
|
uses ocv.core.types_c, ocv.imgproc.types_c;
|
2013-04-13 16:59:47 +02:00
|
|
|
|
|
|
|
/// ****************************************************************************************\
|
|
|
|
// * Motion Analysis *
|
|
|
|
// \****************************************************************************************/
|
|
|
|
//
|
|
|
|
/// ************************************ optical flow ***************************************/
|
|
|
|
const
|
|
|
|
CV_LKFLOW_PYR_A_READY = 1;
|
|
|
|
CV_LKFLOW_PYR_B_READY = 2;
|
|
|
|
CV_LKFLOW_INITIAL_GUESSES = 4;
|
|
|
|
CV_LKFLOW_GET_MIN_EIGENVALS = 8;
|
|
|
|
|
|
|
|
/// * It is Lucas & Kanade method, modified to use pyramids.
|
|
|
|
// Also it does several iterations to get optical flow for
|
|
|
|
// every point at every pyramid level.
|
|
|
|
// Calculates optical flow between two images for certain set of points (i.e.
|
|
|
|
// it is a "sparse" optical flow, which is opposite to the previous 3 methods) */
|
|
|
|
// CVAPI(void) cvCalcOpticalFlowPyrLK( const CvArr* prev, const CvArr* curr,
|
|
|
|
// CvArr* prev_pyr, CvArr* curr_pyr,
|
|
|
|
// const CvPoint2D32f* prev_features,
|
|
|
|
// CvPoint2D32f* curr_features,
|
|
|
|
// int count,
|
|
|
|
// CvSize win_size,
|
|
|
|
// int level,
|
|
|
|
// char* status,
|
|
|
|
// float* track_error,
|
|
|
|
// CvTermCriteria criteria,
|
|
|
|
// int flags );
|
2013-05-26 10:50:18 +02:00
|
|
|
procedure cvCalcOpticalFlowPyrLK(const prev: pIplImage; const curr: pIplImage; prev_pyr: pIplImage; curr_pyr: pIplImage;
|
|
|
|
const prev_features: pCvPoint2D32f; curr_features: pCvPoint2D32f; count: Integer; win_size: TCvSize; level: Integer;
|
|
|
|
status: pCVChar; track_error: PSingle; criteria: TCvTermCriteria; flags: Integer); cdecl;
|
|
|
|
|
2013-04-13 16:59:47 +02:00
|
|
|
/// * Modification of a previous sparse optical flow algorithm to calculate
|
|
|
|
// affine flow */
|
|
|
|
// CVAPI(void) cvCalcAffineFlowPyrLK( const CvArr* prev, const CvArr* curr,
|
|
|
|
// CvArr* prev_pyr, CvArr* curr_pyr,
|
|
|
|
// const CvPoint2D32f* prev_features,
|
|
|
|
// CvPoint2D32f* curr_features,
|
|
|
|
// float* matrices, int count,
|
|
|
|
// CvSize win_size, int level,
|
|
|
|
// char* status, float* track_error,
|
|
|
|
// CvTermCriteria criteria, int flags );
|
|
|
|
//
|
|
|
|
/// * Estimate rigid transformation between 2 images or 2 point sets */
|
|
|
|
// CVAPI(int) cvEstimateRigidTransform( const CvArr* A, const CvArr* B,
|
|
|
|
// CvMat* M, int full_affine );
|
|
|
|
//
|
|
|
|
/// * Estimate optical flow for each pixel using the two-frame G. Farneback algorithm */
|
|
|
|
// CVAPI(void) cvCalcOpticalFlowFarneback( const CvArr* prev, const CvArr* next,
|
|
|
|
// CvArr* flow, double pyr_scale, int levels,
|
|
|
|
// int winsize, int iterations, int poly_n,
|
|
|
|
// double poly_sigma, int flags );
|
2013-05-26 10:50:18 +02:00
|
|
|
procedure cvCalcOpticalFlowFarneback(const prev: pCvMat; const next: pCvMat; flow: pCvMat; pyr_scale: double;
|
|
|
|
levels: Integer; winsize: Integer; iterations: Integer; poly_n: Integer; poly_sigma: double; flags: Integer); cdecl;
|
|
|
|
|
2013-04-13 16:59:47 +02:00
|
|
|
/// ********************************* motion templates *************************************/
|
|
|
|
//
|
|
|
|
/// ****************************************************************************************\
|
|
|
|
// * All the motion template functions work only with single channel images. *
|
|
|
|
// * Silhouette image must have depth IPL_DEPTH_8U or IPL_DEPTH_8S *
|
|
|
|
// * Motion history image must have depth IPL_DEPTH_32F, *
|
|
|
|
// * Gradient mask - IPL_DEPTH_8U or IPL_DEPTH_8S, *
|
|
|
|
// * Motion orientation image - IPL_DEPTH_32F *
|
|
|
|
// * Segmentation mask - IPL_DEPTH_32F *
|
|
|
|
// * All the angles are in degrees, all the times are in milliseconds *
|
|
|
|
// \****************************************************************************************/
|
|
|
|
|
|
|
|
/// * Updates motion history image given motion silhouette */
|
|
|
|
// CVAPI(void) cvUpdateMotionHistory( const CvArr* silhouette, CvArr* mhi,
|
|
|
|
// double timestamp, double duration );
|
|
|
|
procedure cvUpdateMotionHistory(const silhouette: pCvArr; mhi: pCvArr; timestamp: double; duration: double); cdecl;
|
|
|
|
|
|
|
|
/// * Calculates gradient of the motion history image and fills
|
|
|
|
// a mask indicating where the gradient is valid */
|
|
|
|
// CVAPI(void) cvCalcMotionGradient( const CvArr* mhi, CvArr* mask, CvArr* orientation,
|
|
|
|
// double delta1, double delta2,
|
|
|
|
// int aperture_size CV_DEFAULT(3));
|
|
|
|
procedure cvCalcMotionGradient(const mhi: pCvArr; mask: pCvArr; orientation: pCvArr; delta1: double; delta2: double;
|
|
|
|
aperture_size: Integer = 3); cdecl;
|
|
|
|
|
|
|
|
/// * Calculates average motion direction within a selected motion region
|
|
|
|
// (region can be selected by setting ROIs and/or by composing a valid gradient mask
|
|
|
|
// with the region mask) */
|
|
|
|
// CVAPI(double) cvCalcGlobalOrientation( const CvArr* orientation, const CvArr* mask,
|
|
|
|
// const CvArr* mhi, double timestamp,
|
|
|
|
// double duration );
|
|
|
|
function cvCalcGlobalOrientation(const orientation: pCvArr; const mask: pCvArr; const mhi: pCvArr; timestamp: double;
|
|
|
|
duration: double): double; cdecl;
|
|
|
|
|
|
|
|
/// * Splits a motion history image into a few parts corresponding to separate independent motions
|
|
|
|
// (e.g. left hand, right hand) */
|
|
|
|
// CVAPI(CvSeq*) cvSegmentMotion( const CvArr* mhi, CvArr* seg_mask,
|
|
|
|
// CvMemStorage* storage,
|
|
|
|
// double timestamp, double seg_thresh );
|
|
|
|
function cvSegmentMotion(const mhi: pCvArr; seg_mask: pCvArr; storage: pCvMemStorage; timestamp: double;
|
|
|
|
seg_thresh: double): pCvSeq; cdecl;
|
|
|
|
|
|
|
|
/// ****************************************************************************************\
|
|
|
|
// * Tracking *
|
|
|
|
// \****************************************************************************************/
|
|
|
|
//
|
|
|
|
/// * Implements CAMSHIFT algorithm - determines object position, size and orientation
|
|
|
|
// from the object histogram back project (extension of meanshift) */
|
|
|
|
// CVAPI(int) cvCamShift( const CvArr* prob_image, CvRect window,
|
|
|
|
// CvTermCriteria criteria, CvConnectedComp* comp,
|
|
|
|
// CvBox2D* box CV_DEFAULT(NULL) );
|
2013-05-26 10:50:18 +02:00
|
|
|
function cvCamShift(const prob_image: pIplImage; window: TCvRect; criteria: TCvTermCriteria; comp: pCvConnectedComp;
|
|
|
|
box: pCvBox2D = nil): Integer; cdecl;
|
|
|
|
|
2013-04-13 16:59:47 +02:00
|
|
|
/// * Implements MeanShift algorithm - determines object position
|
|
|
|
// from the object histogram back project */
|
|
|
|
// CVAPI(int) cvMeanShift( const CvArr* prob_image, CvRect window,
|
|
|
|
// CvTermCriteria criteria, CvConnectedComp* comp );
|
|
|
|
//
|
|
|
|
/// *
|
|
|
|
// standard Kalman filter (in G. Welch' and G. Bishop's notation):
|
|
|
|
//
|
|
|
|
// x(k)=A*x(k-1)+B*u(k)+w(k) p(w)~N(0,Q)
|
|
|
|
// z(k)=H*x(k)+v(k), p(v)~N(0,R)
|
|
|
|
// */
|
|
|
|
// typedef struct CvKalman
|
|
|
|
// {
|
|
|
|
// int MP; /* number of measurement vector dimensions */
|
|
|
|
// int DP; /* number of state vector dimensions */
|
|
|
|
// int CP; /* number of control vector dimensions */
|
|
|
|
//
|
|
|
|
// /* backward compatibility fields */
|
|
|
|
// #if 1
|
|
|
|
// float* PosterState; /* =state_pre->data.fl */
|
|
|
|
// float* PriorState; /* =state_post->data.fl */
|
|
|
|
// float* DynamMatr; /* =transition_matrix->data.fl */
|
|
|
|
// float* MeasurementMatr; /* =measurement_matrix->data.fl */
|
|
|
|
// float* MNCovariance; /* =measurement_noise_cov->data.fl */
|
|
|
|
// float* PNCovariance; /* =process_noise_cov->data.fl */
|
|
|
|
// float* KalmGainMatr; /* =gain->data.fl */
|
|
|
|
// float* PriorErrorCovariance;/* =error_cov_pre->data.fl */
|
|
|
|
// float* PosterErrorCovariance;/* =error_cov_post->data.fl */
|
|
|
|
// float* Temp1; /* temp1->data.fl */
|
|
|
|
// float* Temp2; /* temp2->data.fl */
|
|
|
|
// #endif
|
|
|
|
//
|
|
|
|
// CvMat* state_pre; /* predicted state (x'(k)):
|
|
|
|
// x(k)=A*x(k-1)+B*u(k) */
|
|
|
|
// CvMat* state_post; /* corrected state (x(k)):
|
|
|
|
// x(k)=x'(k)+K(k)*(z(k)-H*x'(k)) */
|
|
|
|
// CvMat* transition_matrix; /* state transition matrix (A) */
|
|
|
|
// CvMat* control_matrix; /* control matrix (B)
|
|
|
|
// (it is not used if there is no control)*/
|
|
|
|
// CvMat* measurement_matrix; /* measurement matrix (H) */
|
|
|
|
// CvMat* process_noise_cov; /* process noise covariance matrix (Q) */
|
|
|
|
// CvMat* measurement_noise_cov; /* measurement noise covariance matrix (R) */
|
|
|
|
// CvMat* error_cov_pre; /* priori error estimate covariance matrix (P'(k)):
|
|
|
|
// P'(k)=A*P(k-1)*At + Q)*/
|
|
|
|
// CvMat* gain; /* Kalman gain matrix (K(k)):
|
|
|
|
// K(k)=P'(k)*Ht*inv(H*P'(k)*Ht+R)*/
|
|
|
|
// CvMat* error_cov_post; /* posteriori error estimate covariance matrix (P(k)):
|
|
|
|
// P(k)=(I-K(k)*H)*P'(k) */
|
|
|
|
// CvMat* temp1; /* temporary matrices */
|
|
|
|
// CvMat* temp2;
|
|
|
|
// CvMat* temp3;
|
|
|
|
// CvMat* temp4;
|
|
|
|
// CvMat* temp5;
|
|
|
|
// } CvKalman;
|
|
|
|
//
|
|
|
|
/// * Creates Kalman filter and sets A, B, Q, R and state to some initial values */
|
|
|
|
// CVAPI(CvKalman*) cvCreateKalman( int dynam_params, int measure_params,
|
|
|
|
// int control_params CV_DEFAULT(0));
|
|
|
|
//
|
|
|
|
/// * Releases Kalman filter state */
|
|
|
|
// CVAPI(void) cvReleaseKalman( CvKalman** kalman);
|
|
|
|
//
|
|
|
|
/// * Updates Kalman filter by time (predicts future state of the system) */
|
|
|
|
// CVAPI(const CvMat*) cvKalmanPredict( CvKalman* kalman,
|
|
|
|
// const CvMat* control CV_DEFAULT(NULL));
|
|
|
|
//
|
|
|
|
/// * Updates Kalman filter by measurement
|
|
|
|
// (corrects state of the system and internal matrices) */
|
|
|
|
// CVAPI(const CvMat*) cvKalmanCorrect( CvKalman* kalman, const CvMat* measurement );
|
|
|
|
//
|
|
|
|
// #define cvKalmanUpdateByTime cvKalmanPredict
|
|
|
|
// #define cvKalmanUpdateByMeasurement cvKalmanCorrect
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// #ifdef __cplusplus
|
|
|
|
// } // extern "C"
|
|
|
|
// #endif
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// #endif // __OPENCV_TRACKING_C_H__
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
2014-05-22 08:53:48 +02:00
|
|
|
uses
|
2014-05-22 16:23:41 +02:00
|
|
|
ocv.lib;
|
2013-04-13 16:59:47 +02:00
|
|
|
|
2014-05-22 08:53:48 +02:00
|
|
|
function cvCamShift; external tracking_lib;
|
|
|
|
procedure cvCalcOpticalFlowPyrLK; external tracking_lib;
|
|
|
|
procedure cvCalcOpticalFlowFarneback; external tracking_lib;
|
2013-05-26 10:50:18 +02:00
|
|
|
|
2014-05-22 08:53:48 +02:00
|
|
|
procedure cvUpdateMotionHistory; external tracking_lib;
|
|
|
|
procedure cvCalcMotionGradient; external tracking_lib;
|
|
|
|
function cvSegmentMotion; external tracking_lib;
|
|
|
|
function cvCalcGlobalOrientation; external tracking_lib;
|
2013-04-13 16:59:47 +02:00
|
|
|
|
|
|
|
end.
|