gpt4 book ai didi

opencv - 具有四个输入参数的卡尔曼滤波器

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:49 24 4
gpt4 key购买 nike

我这几天一直在研究卡尔曼滤波器的操作,以提高我的人脸检测程序的性能。根据我收集到的信息,我整理了一个代码。卡尔曼滤波部分代码如下。

int Kalman(int X,int faceWidth,int Y,int faceHeight, IplImage *img1){
CvRandState rng;
const float T = 0.1;

// Initialize Kalman filter object, window, number generator, etc
cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI );

//IplImage* img = cvCreateImage( cvSize(500,500), 8, 3 );
CvKalman* kalman = cvCreateKalman( 4, 4, 0 );

// Initializing with random guesses
// state x_k
CvMat* state = cvCreateMat( 4, 1, CV_32FC1 );
cvRandSetRange( &rng, 0, 0.1, 0 );
rng.disttype = CV_RAND_NORMAL;
cvRand( &rng, state );

// Process noise w_k
CvMat* process_noise = cvCreateMat( 4, 1, CV_32FC1 );

// Measurement z_k
CvMat* measurement = cvCreateMat( 4, 1, CV_32FC1 );
cvZero(measurement);

/* create matrix data */
const float A[] = {
1, 0, T, 0,
0, 1, 0, T,
0, 0, 1, 0,
0, 0, 0, 1
};

const float H[] = {
1, 0, 0, 0,
0, 0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0
};

//Didn't use this matrix in the end as it gave an error:'ambiguous call to overloaded function'
/* const float P[] = {
pow(320,2), pow(320,2)/T, 0, 0,
pow(320,2)/T, pow(320,2)/pow(T,2), 0, 0,
0, 0, pow(240,2), pow(240,2)/T,
0, 0, pow(240,2)/T, pow(240,2)/pow(T,2)
}; */

const float Q[] = {
pow(T,3)/3, pow(T,2)/2, 0, 0,
pow(T,2)/2, T, 0, 0,
0, 0, pow(T,3)/3, pow(T,2)/2,
0, 0, pow(T,2)/2, T
};

const float R[] = {
1, 0, 0, 0,
0, 0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0
};

//Copy created matrices into kalman structure
memcpy( kalman->transition_matrix->data.fl, A, sizeof(A));
memcpy( kalman->measurement_matrix->data.fl, H, sizeof(H));
memcpy( kalman->process_noise_cov->data.fl, Q, sizeof(Q));
//memcpy( kalman->error_cov_post->data.fl, P, sizeof(P));
memcpy( kalman->measurement_noise_cov->data.fl, R, sizeof(R));

//Initialize other Kalman Filter parameters
//cvSetIdentity( kalman->measurement_matrix, cvRealScalar(1) );
//cvSetIdentity( kalman->process_noise_cov, cvRealScalar(1e-5) );
/*cvSetIdentity( kalman->measurement_noise_cov, cvRealScalar(1e-1) );*/
cvSetIdentity( kalman->error_cov_post, cvRealScalar(1e-5) );

/* choose initial state */
kalman->state_post->data.fl[0]=X;
kalman->state_post->data.fl[1]=faceWidth;
kalman->state_post->data.fl[2]=Y;
kalman->state_post->data.fl[3]=faceHeight;

//cvRand( &rng, kalman->state_post );

/* predict position of point */
const CvMat* prediction=cvKalmanPredict(kalman,0);

//generate measurement (z_k)
cvRandSetRange( &rng, 0, sqrt(kalman->measurement_noise_cov->data.fl[0]), 0 );
cvRand( &rng, measurement );
cvMatMulAdd( kalman->measurement_matrix, state, measurement, measurement );

//Draw rectangles in detected face location
cvRectangle( img1,
cvPoint( kalman->state_post->data.fl[0], kalman->state_post->data.fl[2] ),
cvPoint( kalman->state_post->data.fl[1], kalman->state_post->data.fl[3] ),
CV_RGB( 0, 255, 0 ), 1, 8, 0 );

cvRectangle( img1,
cvPoint( prediction->data.fl[0], prediction->data.fl[2] ),
cvPoint( prediction->data.fl[1], prediction->data.fl[3] ),
CV_RGB( 0, 0, 255 ), 1, 8, 0 );

cvShowImage("Kalman",img1);

//adjust kalman filter state
cvKalmanCorrect(kalman,measurement);

cvMatMulAdd(kalman->transition_matrix, state, process_noise, state);

return 0;
}

在人脸检测部分(未显示),为检测到的人脸绘制了一个框。 'X, Y, faceWidth and faceHeight' 是框的坐标以及传递到卡尔曼滤波器的宽度和高度。 'img1' 是视频的当前帧。

结果:

虽然我确实从“state_post”和“prediction”数据中得到了两个新矩形(如代码中所示),但它们似乎都没有比没有使用卡尔曼滤波器绘制的初始框更稳定。

这是我的问题:

  1. 矩阵是否已初始化(转换矩阵 A、测量矩阵 H 等),对于这四个输入情况是否正确? (例如,四个输入的 4*4 矩阵?)
  2. 我们不能将每个矩阵设置为单位矩阵吗?
  3. 在绘制矩形之前我遵循的方法在理论上是否正确?我遵循了 this 中的示例和不使用外部输入的书“学习 OpenCV”。

如有任何帮助,我们将不胜感激!

最佳答案

如果直接从图像测量,H[] 应该是恒等式。如果您有 4 个测量值,并且您在对角线上的某些值设为 0,那么您将这些预期测量值 (x*H) 设为 0,但事实并非如此。那么卡尔曼滤波器的新息度(z- x*H)就会很高。

R[] 也应该是对角线的,尽管测量误差的协方差可以与一个不同。如果您有归一化坐标(宽度=高度=1),R 可能类似于 0.01。如果处理的是像素坐标,R=diagonal_ones 表示误差一个像素,没关系。您可以尝试使用 2、3、4 等...

你的转换矩阵 A[] 应该在每一帧上传播状态,看起来像一个由 x、y、v_x 和 v_y 组成的状态的转换矩阵。你没有在你的模型中提到速度,你只谈论测量。注意,不要混淆 State(描述面部位置)和 Measurements(用于更新状态)。您的状态可以是位置、速度和加速度,您的测量值可以是图像中的 n 个点。或者面部的 x 和 y 位置。

希望这对您有所帮助。

关于opencv - 具有四个输入参数的卡尔曼滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10410395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com