mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 15:53:03 +04:00
removed C API in the following modules: photo, video, imgcodecs, videoio (#13060)
* removed C API in the following modules: photo, video, imgcodecs, videoio * trying to fix various compile errors and warnings on Windows and Linux * continue to fix compile errors and warnings * continue to fix compile errors, warnings, as well as the test failures * trying to resolve compile warnings on Android * Update cap_dc1394_v2.cpp fix warning from the new GCC
This commit is contained in:
@@ -47,6 +47,14 @@
|
||||
#include "opencv2/core.hpp"
|
||||
#include "opencv2/imgproc.hpp"
|
||||
|
||||
enum
|
||||
{
|
||||
CV_LKFLOW_PYR_A_READY = 1,
|
||||
CV_LKFLOW_PYR_B_READY = 2,
|
||||
CV_LKFLOW_INITIAL_GUESSES = 4,
|
||||
CV_LKFLOW_GET_MIN_EIGENVALS = 8
|
||||
};
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
|
||||
@@ -1,228 +0,0 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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.
|
||||
// Copyright (C) 2013, OpenCV Foundation, 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
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef OPENCV_TRACKING_C_H
|
||||
#define OPENCV_TRACKING_C_H
|
||||
|
||||
#include "opencv2/imgproc/types_c.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** @addtogroup video_c
|
||||
@{
|
||||
*/
|
||||
|
||||
/****************************************************************************************\
|
||||
* Motion Analysis *
|
||||
\****************************************************************************************/
|
||||
|
||||
/************************************ optical flow ***************************************/
|
||||
|
||||
#define CV_LKFLOW_PYR_A_READY 1
|
||||
#define CV_LKFLOW_PYR_B_READY 2
|
||||
#define CV_LKFLOW_INITIAL_GUESSES 4
|
||||
#define 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 );
|
||||
|
||||
|
||||
/* 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 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 );
|
||||
|
||||
/********************************* 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 );
|
||||
|
||||
/* 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));
|
||||
|
||||
/* 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 );
|
||||
|
||||
/* 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 );
|
||||
|
||||
/****************************************************************************************\
|
||||
* 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) );
|
||||
|
||||
/* 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
|
||||
|
||||
/** @} video_c */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
|
||||
#endif // OPENCV_TRACKING_C_H
|
||||
@@ -1,301 +0,0 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2013, OpenCV Foundation, 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
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
#include "opencv2/video/tracking_c.h"
|
||||
|
||||
|
||||
/////////////////////////// Meanshift & CAMShift ///////////////////////////
|
||||
|
||||
CV_IMPL int
|
||||
cvMeanShift( const void* imgProb, CvRect windowIn,
|
||||
CvTermCriteria criteria, CvConnectedComp* comp )
|
||||
{
|
||||
cv::Mat img = cv::cvarrToMat(imgProb);
|
||||
cv::Rect window = windowIn;
|
||||
int iters = cv::meanShift(img, window, criteria);
|
||||
|
||||
if( comp )
|
||||
{
|
||||
comp->rect = cvRect(window);
|
||||
comp->area = cvRound(cv::sum(img(window))[0]);
|
||||
}
|
||||
|
||||
return iters;
|
||||
}
|
||||
|
||||
|
||||
CV_IMPL int
|
||||
cvCamShift( const void* imgProb, CvRect windowIn,
|
||||
CvTermCriteria criteria,
|
||||
CvConnectedComp* comp,
|
||||
CvBox2D* box )
|
||||
{
|
||||
cv::Mat img = cv::cvarrToMat(imgProb);
|
||||
cv::Rect window = windowIn;
|
||||
cv::RotatedRect rr = cv::CamShift(img, window, criteria);
|
||||
|
||||
if( comp )
|
||||
{
|
||||
comp->rect = cvRect(window);
|
||||
cv::Rect roi = rr.boundingRect() & cv::Rect(0, 0, img.cols, img.rows);
|
||||
comp->area = cvRound(cv::sum(img(roi))[0]);
|
||||
}
|
||||
|
||||
if( box )
|
||||
*box = cvBox2D(rr);
|
||||
|
||||
return rr.size.width*rr.size.height > 0.f ? 1 : -1;
|
||||
}
|
||||
|
||||
///////////////////////////////// Kalman ///////////////////////////////
|
||||
|
||||
CV_IMPL CvKalman*
|
||||
cvCreateKalman( int DP, int MP, int CP )
|
||||
{
|
||||
CvKalman *kalman = 0;
|
||||
|
||||
if( DP <= 0 || MP <= 0 )
|
||||
CV_Error( CV_StsOutOfRange,
|
||||
"state and measurement vectors must have positive number of dimensions" );
|
||||
|
||||
if( CP < 0 )
|
||||
CP = DP;
|
||||
|
||||
/* allocating memory for the structure */
|
||||
kalman = (CvKalman *)cvAlloc( sizeof( CvKalman ));
|
||||
memset( kalman, 0, sizeof(*kalman));
|
||||
|
||||
kalman->DP = DP;
|
||||
kalman->MP = MP;
|
||||
kalman->CP = CP;
|
||||
|
||||
kalman->state_pre = cvCreateMat( DP, 1, CV_32FC1 );
|
||||
cvZero( kalman->state_pre );
|
||||
|
||||
kalman->state_post = cvCreateMat( DP, 1, CV_32FC1 );
|
||||
cvZero( kalman->state_post );
|
||||
|
||||
kalman->transition_matrix = cvCreateMat( DP, DP, CV_32FC1 );
|
||||
cvSetIdentity( kalman->transition_matrix );
|
||||
|
||||
kalman->process_noise_cov = cvCreateMat( DP, DP, CV_32FC1 );
|
||||
cvSetIdentity( kalman->process_noise_cov );
|
||||
|
||||
kalman->measurement_matrix = cvCreateMat( MP, DP, CV_32FC1 );
|
||||
cvZero( kalman->measurement_matrix );
|
||||
|
||||
kalman->measurement_noise_cov = cvCreateMat( MP, MP, CV_32FC1 );
|
||||
cvSetIdentity( kalman->measurement_noise_cov );
|
||||
|
||||
kalman->error_cov_pre = cvCreateMat( DP, DP, CV_32FC1 );
|
||||
|
||||
kalman->error_cov_post = cvCreateMat( DP, DP, CV_32FC1 );
|
||||
cvZero( kalman->error_cov_post );
|
||||
|
||||
kalman->gain = cvCreateMat( DP, MP, CV_32FC1 );
|
||||
|
||||
if( CP > 0 )
|
||||
{
|
||||
kalman->control_matrix = cvCreateMat( DP, CP, CV_32FC1 );
|
||||
cvZero( kalman->control_matrix );
|
||||
}
|
||||
|
||||
kalman->temp1 = cvCreateMat( DP, DP, CV_32FC1 );
|
||||
kalman->temp2 = cvCreateMat( MP, DP, CV_32FC1 );
|
||||
kalman->temp3 = cvCreateMat( MP, MP, CV_32FC1 );
|
||||
kalman->temp4 = cvCreateMat( MP, DP, CV_32FC1 );
|
||||
kalman->temp5 = cvCreateMat( MP, 1, CV_32FC1 );
|
||||
|
||||
#if 1
|
||||
kalman->PosterState = kalman->state_pre->data.fl;
|
||||
kalman->PriorState = kalman->state_post->data.fl;
|
||||
kalman->DynamMatr = kalman->transition_matrix->data.fl;
|
||||
kalman->MeasurementMatr = kalman->measurement_matrix->data.fl;
|
||||
kalman->MNCovariance = kalman->measurement_noise_cov->data.fl;
|
||||
kalman->PNCovariance = kalman->process_noise_cov->data.fl;
|
||||
kalman->KalmGainMatr = kalman->gain->data.fl;
|
||||
kalman->PriorErrorCovariance = kalman->error_cov_pre->data.fl;
|
||||
kalman->PosterErrorCovariance = kalman->error_cov_post->data.fl;
|
||||
#endif
|
||||
|
||||
return kalman;
|
||||
}
|
||||
|
||||
|
||||
CV_IMPL void
|
||||
cvReleaseKalman( CvKalman** _kalman )
|
||||
{
|
||||
CvKalman *kalman;
|
||||
|
||||
if( !_kalman )
|
||||
CV_Error( CV_StsNullPtr, "" );
|
||||
|
||||
kalman = *_kalman;
|
||||
if( !kalman )
|
||||
return;
|
||||
|
||||
/* freeing the memory */
|
||||
cvReleaseMat( &kalman->state_pre );
|
||||
cvReleaseMat( &kalman->state_post );
|
||||
cvReleaseMat( &kalman->transition_matrix );
|
||||
cvReleaseMat( &kalman->control_matrix );
|
||||
cvReleaseMat( &kalman->measurement_matrix );
|
||||
cvReleaseMat( &kalman->process_noise_cov );
|
||||
cvReleaseMat( &kalman->measurement_noise_cov );
|
||||
cvReleaseMat( &kalman->error_cov_pre );
|
||||
cvReleaseMat( &kalman->gain );
|
||||
cvReleaseMat( &kalman->error_cov_post );
|
||||
cvReleaseMat( &kalman->temp1 );
|
||||
cvReleaseMat( &kalman->temp2 );
|
||||
cvReleaseMat( &kalman->temp3 );
|
||||
cvReleaseMat( &kalman->temp4 );
|
||||
cvReleaseMat( &kalman->temp5 );
|
||||
|
||||
memset( kalman, 0, sizeof(*kalman));
|
||||
|
||||
/* deallocating the structure */
|
||||
cvFree( _kalman );
|
||||
}
|
||||
|
||||
|
||||
CV_IMPL const CvMat*
|
||||
cvKalmanPredict( CvKalman* kalman, const CvMat* control )
|
||||
{
|
||||
if( !kalman )
|
||||
CV_Error( CV_StsNullPtr, "" );
|
||||
|
||||
/* update the state */
|
||||
/* x'(k) = A*x(k) */
|
||||
cvMatMulAdd( kalman->transition_matrix, kalman->state_post, 0, kalman->state_pre );
|
||||
|
||||
if( control && kalman->CP > 0 )
|
||||
/* x'(k) = x'(k) + B*u(k) */
|
||||
cvMatMulAdd( kalman->control_matrix, control, kalman->state_pre, kalman->state_pre );
|
||||
|
||||
/* update error covariance matrices */
|
||||
/* temp1 = A*P(k) */
|
||||
cvMatMulAdd( kalman->transition_matrix, kalman->error_cov_post, 0, kalman->temp1 );
|
||||
|
||||
/* P'(k) = temp1*At + Q */
|
||||
cvGEMM( kalman->temp1, kalman->transition_matrix, 1, kalman->process_noise_cov, 1,
|
||||
kalman->error_cov_pre, CV_GEMM_B_T );
|
||||
|
||||
/* handle the case when there will be measurement before the next predict */
|
||||
cvCopy(kalman->state_pre, kalman->state_post);
|
||||
|
||||
return kalman->state_pre;
|
||||
}
|
||||
|
||||
|
||||
CV_IMPL const CvMat*
|
||||
cvKalmanCorrect( CvKalman* kalman, const CvMat* measurement )
|
||||
{
|
||||
if( !kalman || !measurement )
|
||||
CV_Error( CV_StsNullPtr, "" );
|
||||
|
||||
/* temp2 = H*P'(k) */
|
||||
cvMatMulAdd( kalman->measurement_matrix, kalman->error_cov_pre, 0, kalman->temp2 );
|
||||
/* temp3 = temp2*Ht + R */
|
||||
cvGEMM( kalman->temp2, kalman->measurement_matrix, 1,
|
||||
kalman->measurement_noise_cov, 1, kalman->temp3, CV_GEMM_B_T );
|
||||
|
||||
/* temp4 = inv(temp3)*temp2 = Kt(k) */
|
||||
cvSolve( kalman->temp3, kalman->temp2, kalman->temp4, CV_SVD );
|
||||
|
||||
/* K(k) */
|
||||
cvTranspose( kalman->temp4, kalman->gain );
|
||||
|
||||
/* temp5 = z(k) - H*x'(k) */
|
||||
cvGEMM( kalman->measurement_matrix, kalman->state_pre, -1, measurement, 1, kalman->temp5 );
|
||||
|
||||
/* x(k) = x'(k) + K(k)*temp5 */
|
||||
cvMatMulAdd( kalman->gain, kalman->temp5, kalman->state_pre, kalman->state_post );
|
||||
|
||||
/* P(k) = P'(k) - K(k)*temp2 */
|
||||
cvGEMM( kalman->gain, kalman->temp2, -1, kalman->error_cov_pre, 1,
|
||||
kalman->error_cov_post, 0 );
|
||||
|
||||
return kalman->state_post;
|
||||
}
|
||||
|
||||
///////////////////////////////////// Optical Flow ////////////////////////////////
|
||||
|
||||
CV_IMPL void
|
||||
cvCalcOpticalFlowPyrLK( const void* arrA, const void* arrB,
|
||||
void* /*pyrarrA*/, void* /*pyrarrB*/,
|
||||
const CvPoint2D32f * featuresA,
|
||||
CvPoint2D32f * featuresB,
|
||||
int count, CvSize winSize, int level,
|
||||
char *status, float *error,
|
||||
CvTermCriteria criteria, int flags )
|
||||
{
|
||||
if( count <= 0 )
|
||||
return;
|
||||
CV_Assert( featuresA && featuresB );
|
||||
cv::Mat A = cv::cvarrToMat(arrA), B = cv::cvarrToMat(arrB);
|
||||
cv::Mat ptA(count, 1, CV_32FC2, (void*)featuresA);
|
||||
cv::Mat ptB(count, 1, CV_32FC2, (void*)featuresB);
|
||||
cv::Mat st, err;
|
||||
|
||||
if( status )
|
||||
st = cv::Mat(count, 1, CV_8U, (void*)status);
|
||||
if( error )
|
||||
err = cv::Mat(count, 1, CV_32F, (void*)error);
|
||||
cv::calcOpticalFlowPyrLK( A, B, ptA, ptB, st,
|
||||
error ? cv::_OutputArray(err) : (cv::_OutputArray)cv::noArray(),
|
||||
winSize, level, criteria, flags);
|
||||
}
|
||||
|
||||
|
||||
CV_IMPL 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 )
|
||||
{
|
||||
cv::Mat prev = cv::cvarrToMat(_prev), next = cv::cvarrToMat(_next);
|
||||
cv::Mat flow = cv::cvarrToMat(_flow);
|
||||
CV_Assert( flow.size() == prev.size() && flow.type() == CV_32FC2 );
|
||||
cv::calcOpticalFlowFarneback( prev, next, flow, pyr_scale, levels,
|
||||
winsize, iterations, poly_n, poly_sigma, flags );
|
||||
}
|
||||
@@ -40,10 +40,12 @@
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include "opencv2/video/tracking_c.h"
|
||||
#include "opencv2/video/tracking.hpp"
|
||||
|
||||
namespace opencv_test { namespace {
|
||||
|
||||
using namespace cv;
|
||||
|
||||
class CV_TrackBaseTest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
@@ -59,10 +61,10 @@ protected:
|
||||
void generate_object();
|
||||
|
||||
int min_log_size, max_log_size;
|
||||
CvMat* img;
|
||||
CvBox2D box0;
|
||||
CvSize img_size;
|
||||
CvTermCriteria criteria;
|
||||
Mat img;
|
||||
RotatedRect box0;
|
||||
Size img_size;
|
||||
TermCriteria criteria;
|
||||
int img_type;
|
||||
};
|
||||
|
||||
@@ -84,7 +86,7 @@ CV_TrackBaseTest::~CV_TrackBaseTest()
|
||||
|
||||
void CV_TrackBaseTest::clear()
|
||||
{
|
||||
cvReleaseMat( &img );
|
||||
img.release();
|
||||
cvtest::BaseTest::clear();
|
||||
}
|
||||
|
||||
@@ -103,8 +105,7 @@ int CV_TrackBaseTest::read_params( const cv::FileStorage& fs )
|
||||
max_log_size = cvtest::clipInt( max_log_size, 1, 10 );
|
||||
if( min_log_size > max_log_size )
|
||||
{
|
||||
int t;
|
||||
CV_SWAP( min_log_size, max_log_size, t );
|
||||
std::swap( min_log_size, max_log_size );
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -122,13 +123,12 @@ void CV_TrackBaseTest::generate_object()
|
||||
double a = sin(angle), b = -cos(angle);
|
||||
double inv_ww = 1./(width*width), inv_hh = 1./(height*height);
|
||||
|
||||
img = cvCreateMat( img_size.height, img_size.width, img_type );
|
||||
cvZero( img );
|
||||
img = Mat::zeros( img_size.height, img_size.width, img_type );
|
||||
|
||||
// use the straightforward algorithm: for every pixel check if it is inside the ellipse
|
||||
for( y = 0; y < img_size.height; y++ )
|
||||
{
|
||||
uchar* ptr = img->data.ptr + img->step*y;
|
||||
uchar* ptr = img.ptr(y);
|
||||
float* fl = (float*)ptr;
|
||||
double x_ = (y - cy)*b, y_ = (y - cy)*a;
|
||||
|
||||
@@ -163,8 +163,7 @@ int CV_TrackBaseTest::prepare_test_case( int test_case_idx )
|
||||
|
||||
if( box0.size.width > box0.size.height )
|
||||
{
|
||||
float t;
|
||||
CV_SWAP( box0.size.width, box0.size.height, t );
|
||||
std::swap( box0.size.width, box0.size.height );
|
||||
}
|
||||
|
||||
m = MAX( box0.size.width, box0.size.height );
|
||||
@@ -176,7 +175,7 @@ int CV_TrackBaseTest::prepare_test_case( int test_case_idx )
|
||||
box0.center.x = (float)(img_size.width*0.5 + (cvtest::randReal(rng)-0.5)*(img_size.width - m));
|
||||
box0.center.y = (float)(img_size.height*0.5 + (cvtest::randReal(rng)-0.5)*(img_size.height - m));
|
||||
|
||||
criteria = cvTermCriteria( CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 10, 0.1 );
|
||||
criteria = TermCriteria( TermCriteria::EPS + TermCriteria::MAX_ITER, 10, 0.1 );
|
||||
|
||||
generate_object();
|
||||
|
||||
@@ -209,9 +208,8 @@ protected:
|
||||
int validate_test_results( int test_case_idx );
|
||||
void generate_object();
|
||||
|
||||
CvBox2D box;
|
||||
CvRect init_rect;
|
||||
CvConnectedComp comp;
|
||||
RotatedRect box;
|
||||
Rect init_rect;
|
||||
int area0;
|
||||
};
|
||||
|
||||
@@ -231,12 +229,10 @@ int CV_CamShiftTest::prepare_test_case( int test_case_idx )
|
||||
if( code <= 0 )
|
||||
return code;
|
||||
|
||||
area0 = cvCountNonZero(img);
|
||||
area0 = countNonZero(img);
|
||||
|
||||
for(i = 0; i < 100; i++)
|
||||
{
|
||||
CvMat temp;
|
||||
|
||||
m = MAX(box0.size.width,box0.size.height)*0.8;
|
||||
init_rect.x = cvFloor(box0.center.x - m*(0.45 + cvtest::randReal(rng)*0.2));
|
||||
init_rect.y = cvFloor(box0.center.y - m*(0.45 + cvtest::randReal(rng)*0.2));
|
||||
@@ -248,8 +244,8 @@ int CV_CamShiftTest::prepare_test_case( int test_case_idx )
|
||||
init_rect.y + init_rect.height >= img_size.height )
|
||||
continue;
|
||||
|
||||
cvGetSubRect( img, &temp, init_rect );
|
||||
area = cvCountNonZero( &temp );
|
||||
Mat temp = img(init_rect);
|
||||
area = countNonZero( temp );
|
||||
|
||||
if( area >= 0.1*area0 )
|
||||
break;
|
||||
@@ -261,7 +257,7 @@ int CV_CamShiftTest::prepare_test_case( int test_case_idx )
|
||||
|
||||
void CV_CamShiftTest::run_func(void)
|
||||
{
|
||||
cvCamShift( img, init_rect, criteria, &comp, &box );
|
||||
box = CamShift( img, init_rect, criteria );
|
||||
}
|
||||
|
||||
|
||||
@@ -269,15 +265,14 @@ int CV_CamShiftTest::validate_test_results( int /*test_case_idx*/ )
|
||||
{
|
||||
int code = cvtest::TS::OK;
|
||||
|
||||
double m = MAX(box0.size.width, box0.size.height), delta;
|
||||
double m = MAX(box0.size.width, box0.size.height);
|
||||
double diff_angle;
|
||||
|
||||
if( cvIsNaN(box.size.width) || cvIsInf(box.size.width) || box.size.width <= 0 ||
|
||||
cvIsNaN(box.size.height) || cvIsInf(box.size.height) || box.size.height <= 0 ||
|
||||
cvIsNaN(box.center.x) || cvIsInf(box.center.x) ||
|
||||
cvIsNaN(box.center.y) || cvIsInf(box.center.y) ||
|
||||
cvIsNaN(box.angle) || cvIsInf(box.angle) || box.angle < -180 || box.angle > 180 ||
|
||||
cvIsNaN(comp.area) || cvIsInf(comp.area) || comp.area <= 0 )
|
||||
cvIsNaN(box.angle) || cvIsInf(box.angle) || box.angle < -180 || box.angle > 180 )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Invalid CvBox2D or CvConnectedComp was returned by cvCamShift\n" );
|
||||
code = cvtest::TS::FAIL_INVALID_OUTPUT;
|
||||
@@ -318,29 +313,6 @@ int CV_CamShiftTest::validate_test_results( int /*test_case_idx*/ )
|
||||
goto _exit_;
|
||||
}
|
||||
|
||||
delta = m*0.7;
|
||||
|
||||
if( comp.rect.x < box0.center.x - delta ||
|
||||
comp.rect.y < box0.center.y - delta ||
|
||||
comp.rect.x + comp.rect.width > box0.center.x + delta ||
|
||||
comp.rect.y + comp.rect.height > box0.center.y + delta )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG,
|
||||
"Incorrect CvConnectedComp ((%d,%d,%d,%d) is not within (%.1f,%.1f,%.1f,%.1f))\n",
|
||||
comp.rect.x, comp.rect.y, comp.rect.x + comp.rect.width, comp.rect.y + comp.rect.height,
|
||||
box0.center.x - delta, box0.center.y - delta, box0.center.x + delta, box0.center.y + delta );
|
||||
code = cvtest::TS::FAIL_BAD_ACCURACY;
|
||||
goto _exit_;
|
||||
}
|
||||
|
||||
if( fabs(comp.area - area0) > area0*0.15 )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG,
|
||||
"Incorrect CvConnectedComp area (=%.1f, should be %d)\n", comp.area, area0 );
|
||||
code = cvtest::TS::FAIL_BAD_ACCURACY;
|
||||
goto _exit_;
|
||||
}
|
||||
|
||||
_exit_:
|
||||
|
||||
if( code < 0 )
|
||||
@@ -377,8 +349,7 @@ protected:
|
||||
int validate_test_results( int test_case_idx );
|
||||
void generate_object();
|
||||
|
||||
CvRect init_rect;
|
||||
CvConnectedComp comp;
|
||||
Rect init_rect, rect;
|
||||
int area0, area;
|
||||
};
|
||||
|
||||
@@ -398,12 +369,10 @@ int CV_MeanShiftTest::prepare_test_case( int test_case_idx )
|
||||
if( code <= 0 )
|
||||
return code;
|
||||
|
||||
area0 = cvCountNonZero(img);
|
||||
area0 = countNonZero(img);
|
||||
|
||||
for(i = 0; i < 100; i++)
|
||||
{
|
||||
CvMat temp;
|
||||
|
||||
m = (box0.size.width + box0.size.height)*0.5;
|
||||
init_rect.x = cvFloor(box0.center.x - m*(0.4 + cvtest::randReal(rng)*0.2));
|
||||
init_rect.y = cvFloor(box0.center.y - m*(0.4 + cvtest::randReal(rng)*0.2));
|
||||
@@ -415,8 +384,8 @@ int CV_MeanShiftTest::prepare_test_case( int test_case_idx )
|
||||
init_rect.y + init_rect.height >= img_size.height )
|
||||
continue;
|
||||
|
||||
cvGetSubRect( img, &temp, init_rect );
|
||||
area = cvCountNonZero( &temp );
|
||||
Mat temp = img(init_rect);
|
||||
area = countNonZero( temp );
|
||||
|
||||
if( area >= 0.5*area0 )
|
||||
break;
|
||||
@@ -428,7 +397,8 @@ int CV_MeanShiftTest::prepare_test_case( int test_case_idx )
|
||||
|
||||
void CV_MeanShiftTest::run_func(void)
|
||||
{
|
||||
cvMeanShift( img, init_rect, criteria, &comp );
|
||||
rect = init_rect;
|
||||
meanShift( img, rect, criteria );
|
||||
}
|
||||
|
||||
|
||||
@@ -438,15 +408,8 @@ int CV_MeanShiftTest::validate_test_results( int /*test_case_idx*/ )
|
||||
Point2f c;
|
||||
double m = MAX(box0.size.width, box0.size.height), delta;
|
||||
|
||||
if( cvIsNaN(comp.area) || cvIsInf(comp.area) || comp.area <= 0 )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Invalid CvConnectedComp was returned by cvMeanShift\n" );
|
||||
code = cvtest::TS::FAIL_INVALID_OUTPUT;
|
||||
goto _exit_;
|
||||
}
|
||||
|
||||
c.x = (float)(comp.rect.x + comp.rect.width*0.5);
|
||||
c.y = (float)(comp.rect.y + comp.rect.height*0.5);
|
||||
c.x = (float)(rect.x + rect.width*0.5);
|
||||
c.y = (float)(rect.y + rect.height*0.5);
|
||||
|
||||
if( fabs(c.x - box0.center.x) > m*0.1 ||
|
||||
fabs(c.y - box0.center.y) > m*0.1 )
|
||||
@@ -459,25 +422,16 @@ int CV_MeanShiftTest::validate_test_results( int /*test_case_idx*/ )
|
||||
|
||||
delta = m*0.7;
|
||||
|
||||
if( comp.rect.x < box0.center.x - delta ||
|
||||
comp.rect.y < box0.center.y - delta ||
|
||||
comp.rect.x + comp.rect.width > box0.center.x + delta ||
|
||||
comp.rect.y + comp.rect.height > box0.center.y + delta )
|
||||
if( rect.x < box0.center.x - delta ||
|
||||
rect.y < box0.center.y - delta ||
|
||||
rect.x + rect.width > box0.center.x + delta ||
|
||||
rect.y + rect.height > box0.center.y + delta )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG,
|
||||
"Incorrect CvConnectedComp ((%d,%d,%d,%d) is not within (%.1f,%.1f,%.1f,%.1f))\n",
|
||||
comp.rect.x, comp.rect.y, comp.rect.x + comp.rect.width, comp.rect.y + comp.rect.height,
|
||||
rect.x, rect.y, rect.x + rect.width, rect.y + rect.height,
|
||||
box0.center.x - delta, box0.center.y - delta, box0.center.x + delta, box0.center.y + delta );
|
||||
code = cvtest::TS::FAIL_BAD_ACCURACY;
|
||||
goto _exit_;
|
||||
}
|
||||
|
||||
if( fabs((double)(comp.area - area0)) > fabs((double)(area - area0)) + area0*0.05 )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG,
|
||||
"Incorrect CvConnectedComp area (=%.1f, should be %d)\n", comp.area, area0 );
|
||||
code = cvtest::TS::FAIL_BAD_ACCURACY;
|
||||
goto _exit_;
|
||||
}
|
||||
|
||||
_exit_:
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include "opencv2/video/tracking_c.h"
|
||||
#include "opencv2/video/tracking.hpp"
|
||||
|
||||
namespace opencv_test { namespace {
|
||||
|
||||
@@ -67,54 +67,41 @@ void CV_KalmanTest::run( int )
|
||||
|
||||
const double EPSILON = 1.000;
|
||||
RNG& rng = ts->get_rng();
|
||||
CvKalman* Kalm;
|
||||
int i, j;
|
||||
|
||||
CvMat* Sample = cvCreateMat(Dim,1,CV_32F);
|
||||
CvMat* Temp = cvCreateMat(Dim,1,CV_32F);
|
||||
cv::Mat Sample(Dim,1,CV_32F);
|
||||
cv::Mat Temp(Dim,1,CV_32F);
|
||||
|
||||
Kalm = cvCreateKalman(Dim, Dim);
|
||||
CvMat Dyn = cvMat(Dim,Dim,CV_32F,Kalm->DynamMatr);
|
||||
CvMat Mes = cvMat(Dim,Dim,CV_32F,Kalm->MeasurementMatr);
|
||||
CvMat PNC = cvMat(Dim,Dim,CV_32F,Kalm->PNCovariance);
|
||||
CvMat MNC = cvMat(Dim,Dim,CV_32F,Kalm->MNCovariance);
|
||||
CvMat PriErr = cvMat(Dim,Dim,CV_32F,Kalm->PriorErrorCovariance);
|
||||
CvMat PostErr = cvMat(Dim,Dim,CV_32F,Kalm->PosterErrorCovariance);
|
||||
CvMat PriState = cvMat(Dim,1,CV_32F,Kalm->PriorState);
|
||||
CvMat PostState = cvMat(Dim,1,CV_32F,Kalm->PosterState);
|
||||
cvSetIdentity(&PNC);
|
||||
cvSetIdentity(&PriErr);
|
||||
cvSetIdentity(&PostErr);
|
||||
cvSetZero(&MNC);
|
||||
cvSetZero(&PriState);
|
||||
cvSetZero(&PostState);
|
||||
cvSetIdentity(&Mes);
|
||||
cvSetIdentity(&Dyn);
|
||||
Mat _Sample = cvarrToMat(Sample);
|
||||
cvtest::randUni(rng, _Sample, cvScalarAll(-max_init), cvScalarAll(max_init));
|
||||
cvKalmanCorrect(Kalm, Sample);
|
||||
cv::KalmanFilter Kalm(Dim, Dim);
|
||||
Kalm.transitionMatrix = cv::Mat::eye(Dim, Dim, CV_32F);
|
||||
Kalm.measurementMatrix = cv::Mat::eye(Dim, Dim, CV_32F);
|
||||
Kalm.processNoiseCov = cv::Mat::eye(Dim, Dim, CV_32F);
|
||||
Kalm.errorCovPre = cv::Mat::eye(Dim, Dim, CV_32F);
|
||||
Kalm.errorCovPost = cv::Mat::eye(Dim, Dim, CV_32F);
|
||||
Kalm.measurementNoiseCov = cv::Mat::zeros(Dim, Dim, CV_32F);
|
||||
Kalm.statePre = cv::Mat::zeros(Dim, 1, CV_32F);
|
||||
Kalm.statePost = cv::Mat::zeros(Dim, 1, CV_32F);
|
||||
cvtest::randUni(rng, Sample, Scalar::all(-max_init), Scalar::all(max_init));
|
||||
Kalm.correct(Sample);
|
||||
for(i = 0; i<Steps; i++)
|
||||
{
|
||||
cvKalmanPredict(Kalm);
|
||||
Kalm.predict();
|
||||
const Mat& Dyn = Kalm.transitionMatrix;
|
||||
for(j = 0; j<Dim; j++)
|
||||
{
|
||||
float t = 0;
|
||||
for(int k=0; k<Dim; k++)
|
||||
{
|
||||
t += Dyn.data.fl[j*Dim+k]*Sample->data.fl[k];
|
||||
t += Dyn.at<float>(j,k)*Sample.at<float>(k);
|
||||
}
|
||||
Temp->data.fl[j]= (float)(t+(cvtest::randReal(rng)*2-1)*max_noise);
|
||||
Temp.at<float>(j) = (float)(t+(cvtest::randReal(rng)*2-1)*max_noise);
|
||||
}
|
||||
cvCopy( Temp, Sample );
|
||||
cvKalmanCorrect(Kalm,Temp);
|
||||
Temp.copyTo(Sample);
|
||||
Kalm.correct(Temp);
|
||||
}
|
||||
|
||||
Mat _state_post = cvarrToMat(Kalm->state_post);
|
||||
code = cvtest::cmpEps2( ts, _Sample, _state_post, EPSILON, false, "The final estimated state" );
|
||||
|
||||
cvReleaseMat(&Sample);
|
||||
cvReleaseMat(&Temp);
|
||||
cvReleaseKalman(&Kalm);
|
||||
Mat _state_post = Kalm.statePost;
|
||||
code = cvtest::cmpEps2( ts, Sample, _state_post, EPSILON, false, "The final estimated state" );
|
||||
|
||||
if( code < 0 )
|
||||
ts->set_failed_test_info( code );
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include "opencv2/video/tracking_c.h"
|
||||
|
||||
namespace opencv_test { namespace {
|
||||
|
||||
@@ -71,7 +70,7 @@ void CV_OptFlowPyrLKTest::run( int )
|
||||
int merr_i = 0, merr_j = 0, merr_k = 0, merr_nan = 0;
|
||||
char filename[1000];
|
||||
|
||||
CvPoint2D32f *v = 0, *v2 = 0;
|
||||
cv::Point2f *v = 0, *v2 = 0;
|
||||
cv::Mat _u, _v, _v2;
|
||||
|
||||
cv::Mat imgI, imgJ;
|
||||
@@ -145,8 +144,8 @@ void CV_OptFlowPyrLKTest::run( int )
|
||||
calcOpticalFlowPyrLK(imgI, imgJ, _u, _v2, status, cv::noArray(), Size( 41, 41 ), 4,
|
||||
TermCriteria( TermCriteria::MAX_ITER + TermCriteria::EPS, 30, 0.01f ), 0 );
|
||||
|
||||
v = (CvPoint2D32f*)_v.ptr();
|
||||
v2 = (CvPoint2D32f*)_v2.ptr();
|
||||
v = (cv::Point2f*)_v.ptr();
|
||||
v2 = (cv::Point2f*)_v2.ptr();
|
||||
|
||||
/* compare results */
|
||||
for( i = 0; i < n; i++ )
|
||||
|
||||
Reference in New Issue
Block a user