卡尔曼滤波算法示例代码
来源:互联网 发布:晋中教育网络教研平台 编辑:程序博客网 时间:2024/06/04 18:26
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
static const int winHeight = 600;
static const int winWidth = 800;
static CvPoint mousePosition = cvPoint(winWidth >> 1, winHeight >> 1);
//mouse event callback
static void mouseEvent(int event, int x, int y, int flags, void *param)
{
if (event == CV_EVENT_MOUSEMOVE) {
mousePosition = cvPoint(x, y);
}
}
int main(void)
{
//1.kalman filter setup
const int stateNum = 4;
const int measureNum = 2;
CvKalman* kalman = cvCreateKalman(stateNum, measureNum, 0);//state(x,y,detaX,detaY)
CvMat* process_noise = cvCreateMat(stateNum, 1, CV_32FC1);
CvMat* measurement = cvCreateMat(measureNum, 1, CV_32FC1);//measurement(x,y)
CvRNG rng = cvRNG(-1);
float A[stateNum][stateNum] = {//transition matrix
1, 0, 1, 0,
0, 1, 0, 1,
0, 0, 1, 0,
0, 0, 0, 1
};
memcpy(kalman->transition_matrix->data.fl, A, sizeof(A));
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(1));
//initialize post state of kalman filter at random
cvRandArr(&rng, kalman->state_post, CV_RAND_UNI, cvRealScalar(0), cvRealScalar(winHeight>winWidth ? winWidth : winHeight));
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SCRIPT_COMPLEX, 1, 1);
cvNamedWindow("kalman");
cvSetMouseCallback("kalman", mouseEvent);
IplImage* img = cvCreateImage(cvSize(winWidth, winHeight), 8, 3);
while (1){
//2.kalman prediction
const CvMat* prediction = cvKalmanPredict(kalman, 0);
CvPoint predict_pt = cvPoint((int)prediction->data.fl[0], (int)prediction->data.fl[1]);
//3.update measurement
measurement->data.fl[0] = (float)mousePosition.x;
measurement->data.fl[1] = (float)mousePosition.y;
//4.update
cvKalmanCorrect(kalman, measurement);
//draw
cvSet(img, cvScalar(255, 255, 255, 0));
cvCircle(img, predict_pt, 5, CV_RGB(0, 255, 0), 3);//predicted point with green
cvCircle(img, mousePosition, 5, CV_RGB(255, 0, 0), 3);//current position with red
char buf[256];
sprintf_s(buf, 256, "predicted position:(%3d,%3d)", predict_pt.x, predict_pt.y);
cvPutText(img, buf, cvPoint(10, 30), &font, CV_RGB(0, 0, 0));
sprintf_s(buf, 256, "current position :(%3d,%3d)", mousePosition.x, mousePosition.y);
cvPutText(img, buf, cvPoint(10, 60), &font, CV_RGB(0, 0, 0));
cvShowImage("kalman", img);
int key = cvWaitKey(1000);
if (key == 27){//esc
break;
}
}
cvReleaseImage(&img);
cvReleaseKalman(&kalman);
return 0;
}
#include <cxcore.h>
#include <highgui.h>
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
static const int winHeight = 600;
static const int winWidth = 800;
static CvPoint mousePosition = cvPoint(winWidth >> 1, winHeight >> 1);
//mouse event callback
static void mouseEvent(int event, int x, int y, int flags, void *param)
{
if (event == CV_EVENT_MOUSEMOVE) {
mousePosition = cvPoint(x, y);
}
}
int main(void)
{
//1.kalman filter setup
const int stateNum = 4;
const int measureNum = 2;
CvKalman* kalman = cvCreateKalman(stateNum, measureNum, 0);//state(x,y,detaX,detaY)
CvMat* process_noise = cvCreateMat(stateNum, 1, CV_32FC1);
CvMat* measurement = cvCreateMat(measureNum, 1, CV_32FC1);//measurement(x,y)
CvRNG rng = cvRNG(-1);
float A[stateNum][stateNum] = {//transition matrix
1, 0, 1, 0,
0, 1, 0, 1,
0, 0, 1, 0,
0, 0, 0, 1
};
memcpy(kalman->transition_matrix->data.fl, A, sizeof(A));
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(1));
//initialize post state of kalman filter at random
cvRandArr(&rng, kalman->state_post, CV_RAND_UNI, cvRealScalar(0), cvRealScalar(winHeight>winWidth ? winWidth : winHeight));
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_SCRIPT_COMPLEX, 1, 1);
cvNamedWindow("kalman");
cvSetMouseCallback("kalman", mouseEvent);
IplImage* img = cvCreateImage(cvSize(winWidth, winHeight), 8, 3);
while (1){
//2.kalman prediction
const CvMat* prediction = cvKalmanPredict(kalman, 0);
CvPoint predict_pt = cvPoint((int)prediction->data.fl[0], (int)prediction->data.fl[1]);
//3.update measurement
measurement->data.fl[0] = (float)mousePosition.x;
measurement->data.fl[1] = (float)mousePosition.y;
//4.update
cvKalmanCorrect(kalman, measurement);
//draw
cvSet(img, cvScalar(255, 255, 255, 0));
cvCircle(img, predict_pt, 5, CV_RGB(0, 255, 0), 3);//predicted point with green
cvCircle(img, mousePosition, 5, CV_RGB(255, 0, 0), 3);//current position with red
char buf[256];
sprintf_s(buf, 256, "predicted position:(%3d,%3d)", predict_pt.x, predict_pt.y);
cvPutText(img, buf, cvPoint(10, 30), &font, CV_RGB(0, 0, 0));
sprintf_s(buf, 256, "current position :(%3d,%3d)", mousePosition.x, mousePosition.y);
cvPutText(img, buf, cvPoint(10, 60), &font, CV_RGB(0, 0, 0));
cvShowImage("kalman", img);
int key = cvWaitKey(1000);
if (key == 27){//esc
break;
}
}
cvReleaseImage(&img);
cvReleaseKalman(&kalman);
return 0;
}
0 0
- 卡尔曼滤波算法示例代码
- 卡尔曼滤波示例
- 卡尔曼滤波算法
- 卡尔曼滤波算法
- 卡尔曼滤波算法
- 卡尔曼滤波简介+ 算法实现代码
- 卡尔曼滤波简介+ 算法实现代码
- 卡尔曼滤波简介+ 算法实现代码(转)
- 卡尔曼滤波简介及其算法实现代码(转)
- 卡尔曼滤波简介+ 算法实现代码
- 卡尔曼滤波简介+ 算法实现代码
- 【杂谈】【转载】卡尔曼滤波简介及其算法实现代码
- 卡尔曼滤波简介及算法实现代码
- 卡尔曼滤波简介说明及其算法MATLAB实现代码
- 卡尔曼滤波简介+ 算法实现代码
- 卡尔曼滤波简介+ 算法实现代码
- 卡尔曼滤波简介+ 算法实现代码
- 卡尔曼滤波算法原理
- Activity的生命周期
- 深蹲要点
- 豆瓣电影信息爬取并保存到excel
- A. Gotta Catch Em' All!
- 最终排名
- 卡尔曼滤波算法示例代码
- map,set,unordered_map,hash总结
- 看中科院大牛博士如何进行文献检索和阅读
- C++ 读入优化与输出优化 模板
- 选票统计
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
- 分页和分段存储管理有何区别
- b 【NOIP2017GDKOI模拟1.12】
- Android窗口机制(二)Window,PhoneWindow,DecorView,setContentView源码理解