From 92fb499ba9476134dcc7778001091cc4a76d349c Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 22 Nov 2010 21:05:22 +0000 Subject: [PATCH] added type selection in the Kalman filter (thanks to Nghia Ho for the patch; see ticket #693) --- .../video/include/opencv2/video/tracking.hpp | 4 +- modules/video/src/kalman.cpp | 37 ++++++++++--------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/modules/video/include/opencv2/video/tracking.hpp b/modules/video/include/opencv2/video/tracking.hpp index abd7f27b0c..fc36e2148a 100644 --- a/modules/video/include/opencv2/video/tracking.hpp +++ b/modules/video/include/opencv2/video/tracking.hpp @@ -280,9 +280,9 @@ public: //! the default constructor CV_WRAP KalmanFilter(); //! the full constructor taking the dimensionality of the state, of the measurement and of the control vector - CV_WRAP KalmanFilter(int dynamParams, int measureParams, int controlParams=0); + CV_WRAP KalmanFilter(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F); //! re-initializes Kalman filter. The previous content is destroyed. - void init(int dynamParams, int measureParams, int controlParams=0); + void init(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F); //! computes predicted state CV_WRAP const Mat& predict(const Mat& control=Mat()); diff --git a/modules/video/src/kalman.cpp b/modules/video/src/kalman.cpp index d34ffda3e0..4741f4965b 100644 --- a/modules/video/src/kalman.cpp +++ b/modules/video/src/kalman.cpp @@ -211,38 +211,39 @@ namespace cv { KalmanFilter::KalmanFilter() {} -KalmanFilter::KalmanFilter(int dynamParams, int measureParams, int controlParams) +KalmanFilter::KalmanFilter(int dynamParams, int measureParams, int controlParams, int type) { - init(dynamParams, measureParams, controlParams); + init(dynamParams, measureParams, controlParams, type); } -void KalmanFilter::init(int DP, int MP, int CP) +void KalmanFilter::init(int DP, int MP, int CP, int type) { CV_Assert( DP > 0 && MP > 0 ); + CV_Assert( type == CV_32F || type == CV_64F ); CP = std::max(CP, 0); - statePre = Mat::zeros(DP, 1, CV_32F); - statePost = Mat::zeros(DP, 1, CV_32F); - transitionMatrix = Mat::eye(DP, DP, CV_32F); + statePre = Mat::zeros(DP, 1, type); + statePost = Mat::zeros(DP, 1, type); + transitionMatrix = Mat::eye(DP, DP, type); - processNoiseCov = Mat::eye(DP, DP, CV_32F); - measurementMatrix = Mat::zeros(MP, DP, CV_32F); - measurementNoiseCov = Mat::eye(MP, MP, CV_32F); + processNoiseCov = Mat::eye(DP, DP, type); + measurementMatrix = Mat::zeros(MP, DP, type); + measurementNoiseCov = Mat::eye(MP, MP, type); - errorCovPre = Mat::zeros(DP, DP, CV_32F); - errorCovPost = Mat::zeros(DP, DP, CV_32F); - gain = Mat::zeros(DP, MP, CV_32F); + errorCovPre = Mat::zeros(DP, DP, type); + errorCovPost = Mat::zeros(DP, DP, type); + gain = Mat::zeros(DP, MP, type); if( CP > 0 ) - controlMatrix = Mat::zeros(DP, CP, CV_32F); + controlMatrix = Mat::zeros(DP, CP, type); else controlMatrix.release(); - temp1.create(DP, DP, CV_32F); - temp2.create(MP, DP, CV_32F); - temp3.create(MP, MP, CV_32F); - temp4.create(MP, DP, CV_32F); - temp5.create(MP, 1, CV_32F); + temp1.create(DP, DP, type); + temp2.create(MP, DP, type); + temp3.create(MP, MP, type); + temp4.create(MP, DP, type); + temp5.create(MP, 1, type); } const Mat& KalmanFilter::predict(const Mat& control) -- GitLab