diff --git a/modules/video/include/opencv2/video/tracking.hpp b/modules/video/include/opencv2/video/tracking.hpp index abd7f27b0cc844a2b56a6b7c9485e2aacd3cf8ea..fc36e2148a706cae7205852ff9b522ecfa97381f 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 d34ffda3e0ff34720d5836172ef816ab6c458be7..4741f4965b49070af7c06403bbe96fe50cdfd257 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)