Kalman算法C++实现代码(编译运行通过)

简介: Kalman算法C++实现代码(编译运行通过)

参考

https://blog.csdn.net/yongjiankuang/article/details/76218996


安装编译opencv

https://blog.csdn.net/quantum7/article/details/82881521


特别注意:


sudo apt-get install cmake libgtk2.0-dev pkg-config

gh_kalman.h

#ifndef __KALMAN_H__
#define __KALMAN_H__
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class KALMAN
{
public:
    KALMAN(int state_size, int mea_size);
    ~KALMAN();
public:
    Mat statePre;            //预测状态矩阵(x'(k)) x(k) = A*x(k - 1) + B * u(k)
    Mat statePost;           //状态估计修正矩阵(x(k)) x(k) = x'(k) + K(k)*(z(k) - H * x'(k)) : 1 * 8
    Mat transitionMatrix;    //转移矩阵(A)  : 8 * 8
    Mat controMatrix;        //控制矩阵(B)
    Mat measurementMatrix;   //测量矩阵(H) :4 * 8
    Mat processNoiseCov;     //预测模型噪声协方差矩阵(Q) :8 * 8
    Mat measurementNoiseCov; //测量噪声协方差矩阵(R)  : 4 * 4
    Mat errorCovPre;         //转移噪声矩阵(P'(k)) p'(k) = A * p(k - 1) * At + Q 
    Mat K;                   //kalman增益矩阵 K = p'(k) * Ht * inv(H * p'(k) * Ht + R)
    Mat errorCovPost;        //转移噪声修正矩阵(p(k)) p(k) = (I - K(k) * H) * p'(k)  : 8 * 8
public:
    void init();
    void update(Mat Y);
    Mat predicted(Mat Y);
};
#endif

gh_kalman.cpp

#include "gh_kalman.h"
KALMAN::KALMAN(int state_size,int mea_size)
{
    transitionMatrix    = Mat::zeros(state_size, state_size, CV_32F);
    measurementMatrix   = Mat::zeros(mea_size,   state_size, CV_32F);
    processNoiseCov     = Mat::zeros(state_size, state_size, CV_32F);
    measurementNoiseCov = Mat::zeros(mea_size,   mea_size,   CV_32F);
    errorCovPre         = Mat::zeros(state_size, state_size, CV_32F);
    errorCovPost        = Mat::zeros(state_size, state_size, CV_32F);
    statePost           = Mat::zeros(state_size, 1,          CV_32F);
    statePre            = Mat::zeros(state_size, 1,          CV_32F);
    K                   = Mat::zeros(state_size, mea_size,   CV_32F);
}
KALMAN::~KALMAN()
{
    //
}
void KALMAN::init()
{
    setIdentity(measurementMatrix,   Scalar::all(1));   //观测矩阵的初始化;
    setIdentity(processNoiseCov,     Scalar::all(1e-5));//模型本身噪声协方差矩阵初始化;
    setIdentity(measurementNoiseCov, Scalar::all(1e-1));//测量噪声的协方差矩阵初始化
    setIdentity(errorCovPost,        Scalar::all(1));   //转移噪声修正矩阵初始化
    randn(statePost,Scalar::all(0),  Scalar::all(5));   //kalaman状态估计修正矩阵初始化
}
void KALMAN::update(Mat Y)
{
    K            = errorCovPre * (measurementMatrix.t()) * ((measurementMatrix * errorCovPre * measurementMatrix.t() + measurementNoiseCov).inv());
    statePost    = statePre    + K * (Y - measurementMatrix * statePre);
    errorCovPost = errorCovPre - K * measurementMatrix * errorCovPre;
}
Mat KALMAN::predicted(Mat Y)
{
    statePre    = transitionMatrix * statePost;
    errorCovPre = transitionMatrix * errorCovPost * transitionMatrix.t() + processNoiseCov;
    update(Y);
    return statePost;
}


gh_test.cpp

#include "gh_kalman.h"
#define WINDOW_NAME  "Kalman"
#define BUFFER_SIZE 512
const int winWidth  = 800;
const int winHeight = 600;
Point mousePosition = Point(winWidth >> 1, winHeight >> 1);
//mouse call back  
void mouseEvent(int event, int x, int y, int flags, void *param)
{
    if (event == CV_EVENT_MOUSEMOVE)
    {
        mousePosition = Point(x, y);
    }
}
int main(int argc, char** argv)
{
    int state_size = 4;
    int mea_size   = 2;
    KALMAN kalman(state_size,mea_size);
    kalman.init();
    kalman.transitionMatrix = (Mat_<float>(4, 4) <<
        1, 0, 1, 0,
        0, 1, 0, 1,
        0, 0, 1, 0,
        0, 0, 0, 1);//元素导入矩阵,按行; 
    Mat g_srcImage;
    Mat showImg(winWidth, winHeight, CV_8UC3);
    Mat measurement(mea_size,1,CV_32F);
    for (;;)
    {
        setMouseCallback(WINDOW_NAME, mouseEvent, 0);
        showImg.setTo(0);
        Point statePt = Point((int)kalman.statePost.at<float>(0), (int)kalman.statePost.at<float>(1));
        //3.update measurement  
        measurement.at<float>(0) = (float)mousePosition.x;
        measurement.at<float>(1) = (float)mousePosition.y;
        //2.kalman prediction     
        Mat   prediction  = kalman.predicted(measurement);
        Point predictPt   = Point((int)prediction.at<float>(0), (int)prediction.at<float>(1));
        //randn( processNoise, Scalar(0), Scalar::all(sqrt(KF.processNoiseCov.at<float>(0, 0))));  
        //state = KF.transitionMatrix*state + processNoise;  
        //draw  
        circle(showImg, statePt,       5, CV_RGB(255,   0,   0), 1);//former point  
        circle(showImg, predictPt,     5, CV_RGB(  0, 255,   0), 1);//predict point  
        circle(showImg, mousePosition, 5, CV_RGB(  0,   0, 255), 1);//ture point  
        //          CvFont font;//字体  
        //          cvInitFont(&font, CV_FONT_HERSHEY_SCRIPT_COMPLEX, 0.5f, 0.5f, 0, 1, 8);  
        char buf[BUFFER_SIZE];
        sprintf(buf, "Green:predicted position:(%3d,%3d)", predictPt.x, predictPt.y);
        //putText(showImg, "Red: Former Point", cvPoint(10, 30), FONT_HERSHEY_SIMPLEX, 1, Scalar::all(255));
        putText(showImg, buf, cvPoint(10, 60), FONT_HERSHEY_SIMPLEX, 1, Scalar::all(255));
        sprintf(buf, "true position:(%3d,%3d)", mousePosition.x, mousePosition.y);
        putText(showImg, buf, cvPoint(10, 90), FONT_HERSHEY_SIMPLEX, 1, Scalar::all(255));
        imshow(WINDOW_NAME, showImg);
        int key = waitKey(3);
        if (key == 27)
        {
            break;
        }
    }
    return 0;
}


编译

有两个问题要注意:


opencv的编译。如果提示Exception,重新编译opencv。


需要的cv库:

-L /usr/local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs
目录
相关文章
|
22天前
|
机器学习/深度学习 人工智能 API
如何在c++侧编译运行一个aclnn(AOL)算子?
CANN的AOL库提供了一系列高性能算子API,优化了昇腾AI处理器的调用流程。通过两段式接口设计,开发者可以高效地调用算子库API,实现模型创新与应用,提升开发效率和模型性能。示例中展示了如何使用`aclnnAdd`算子,包括环境初始化、算子调用及结果处理等步骤。
|
26天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
1月前
|
自然语言处理 编译器 Linux
|
27天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
61 1
|
1月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
1月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
1月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
59 4
|
1月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
49 3
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。