added type selection in the Kalman filter (thanks to Nghia Ho for the patch; see ticket #693)

This commit is contained in:
Vadim Pisarevsky 2010-11-22 21:05:22 +00:00
parent e406dfee44
commit 92fb499ba9
2 changed files with 21 additions and 20 deletions

View File

@ -280,9 +280,9 @@ public:
//! the default constructor //! the default constructor
CV_WRAP KalmanFilter(); CV_WRAP KalmanFilter();
//! the full constructor taking the dimensionality of the state, of the measurement and of the control vector //! 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. //! 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 //! computes predicted state
CV_WRAP const Mat& predict(const Mat& control=Mat()); CV_WRAP const Mat& predict(const Mat& control=Mat());

View File

@ -211,38 +211,39 @@ namespace cv
{ {
KalmanFilter::KalmanFilter() {} 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( DP > 0 && MP > 0 );
CV_Assert( type == CV_32F || type == CV_64F );
CP = std::max(CP, 0); CP = std::max(CP, 0);
statePre = Mat::zeros(DP, 1, CV_32F); statePre = Mat::zeros(DP, 1, type);
statePost = Mat::zeros(DP, 1, CV_32F); statePost = Mat::zeros(DP, 1, type);
transitionMatrix = Mat::eye(DP, DP, CV_32F); transitionMatrix = Mat::eye(DP, DP, type);
processNoiseCov = Mat::eye(DP, DP, CV_32F); processNoiseCov = Mat::eye(DP, DP, type);
measurementMatrix = Mat::zeros(MP, DP, CV_32F); measurementMatrix = Mat::zeros(MP, DP, type);
measurementNoiseCov = Mat::eye(MP, MP, CV_32F); measurementNoiseCov = Mat::eye(MP, MP, type);
errorCovPre = Mat::zeros(DP, DP, CV_32F); errorCovPre = Mat::zeros(DP, DP, type);
errorCovPost = Mat::zeros(DP, DP, CV_32F); errorCovPost = Mat::zeros(DP, DP, type);
gain = Mat::zeros(DP, MP, CV_32F); gain = Mat::zeros(DP, MP, type);
if( CP > 0 ) if( CP > 0 )
controlMatrix = Mat::zeros(DP, CP, CV_32F); controlMatrix = Mat::zeros(DP, CP, type);
else else
controlMatrix.release(); controlMatrix.release();
temp1.create(DP, DP, CV_32F); temp1.create(DP, DP, type);
temp2.create(MP, DP, CV_32F); temp2.create(MP, DP, type);
temp3.create(MP, MP, CV_32F); temp3.create(MP, MP, type);
temp4.create(MP, DP, CV_32F); temp4.create(MP, DP, type);
temp5.create(MP, 1, CV_32F); temp5.create(MP, 1, type);
} }
const Mat& KalmanFilter::predict(const Mat& control) const Mat& KalmanFilter::predict(const Mat& control)