6-1_Kalman濾波
 #include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>
int main(int argc, char** argv)
{
   //創建畫布
   	cv::Mat img(500, 500, CV_8UC3, cv::Scalar(0, 0, 0));
   	//第一個參數是 狀態向量的維度 此為平面 由 角度和角速度 決定
   	cv::KalmanFilter kalmanFilter(2, 1, 0);
   	cv::Mat x_k(2, 1, CV_32F); //此為位置預測方程式
   	cv::randn(x_k, 0., 1);
   	//雜訊的部分
   	cv::Mat w_k(2, 1, CV_32F);
   	//觀測結果 角度 1維
   	cv::Mat z_k = cv::Mat::zeros(1, 1, CV_32F);
	
   	//建立轉移矩陣(F)
   	float F[] = { 1, 1, 0, 1 };
   	kalmanFilter.transitionMatrix = cv::Mat(2, 2, CV_32F, F).clone();
   	//初始化其他的矩陣
   	cv::setIdentity(kalmanFilter.measurementMatrix, cv::Scalar(1));
   	cv::setIdentity(kalmanFilter.processNoiseCov, cv::Scalar(1e-5));
   	cv::setIdentity(kalmanFilter.measurementNoiseCov, cv::Scalar(1e-1));
   	cv::setIdentity(kalmanFilter.errorCovPost, cv::Scalar(1));
   	//隨機初始化狀態
   	cv::randn(kalmanFilter.statePost, 0.0, 0.1);
   	char key = 'i';
   	while (key != 'o')
   	{
      		//預測點的位置
      		cv::Mat y_k = kalmanFilter.predict();
      		cv::randn(z_k, 0.0, sqrt(static_cast
      		z_k = kalmanFilter.measurementMatrix*x_k + z_k;
      		img = cv::Scalar::all(0);
      		cv::circle(img, phi2xy(z_k), 4, cv::Scalar(128, 255, 255));  // 量測(觀測)結果 //黃色
      		cv::circle(img, phi2xy(y_k), 4, cv::Scalar(255, 255, 255), 2);  // 預測結果 //白色
      		cv::circle(img, phi2xy(x_k), 4, cv::Scalar(0, 0, 255));  // 實際結果 //紅色
      		// planar co-ordinates and draw
      		cv::imshow("KalmanFilter", img);
      		kalmanFilter.correct(z_k);
      		cv::randn(w_k, 0.0, sqrt(static_cast
      		x_k = kalmanFilter.transitionMatrix*x_k + w_k; //更新狀態函數 //不需要控制方程式
      		key = cv::waitKey(100);
   	}
   	return 0; 
}