opencv学习1 还有附带的kalman滤波

编程入门 行业动态 更新时间:2024-10-09 09:18:39

<a href=https://www.elefans.com/category/jswz/34/1769967.html style=opencv学习1 还有附带的kalman滤波"/>

opencv学习1 还有附带的kalman滤波

标配opencv头文件
#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>  using namespace cv;  
</pre><pre name="code" class="cpp">
在vs2010中运行vc6.0的文件,可以直接将其拷贝到新的Cpp文件中,当然指的是控制台系统,至于mfc就不会拷贝,
下图为kalman滤波代码,直接拷贝就可以运行。
#include "cv.h"
#include "highgui.h"
#include <math.h>int main(int argc, char** argv)
{/* A matrix data */const float A[] = { 1, 1, 0, 1 };IplImage* img = cvCreateImage( cvSize(500,500), 8, 3 );CvKalman* kalman = cvCreateKalman( 2, 1, 0 );/* state is (phi, delta_phi) - angle and angle increment */CvMat* state = cvCreateMat( 2, 1, CV_32FC1 );CvMat* process_noise = cvCreateMat( 2, 1, CV_32FC1 );/* only phi (angle) is measured */CvMat* measurement = cvCreateMat( 1, 1, CV_32FC1 );CvRandState rng;int code = -1;cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI );cvZero( measurement );cvNamedWindow( "Kalman", 1 );for(;;){cvRandSetRange( &rng, 0, 0.1, 0 );rng.disttype = CV_RAND_NORMAL;cvRand( &rng, state );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));/* choose random initial state */cvRand( &rng, kalman->state_post );rng.disttype = CV_RAND_NORMAL;for(;;){#define calc_point(angle)                                      \cvPoint( cvRound(img->width/2 + img->width/3*cos(angle)),  \cvRound(img->height/2 - img->width/3*sin(angle)))float state_angle = state->data.fl[0];CvPoint state_pt = calc_point(state_angle);/* predict point position */const CvMat* prediction = cvKalmanPredict( kalman, 0 );float predict_angle = prediction->data.fl[0];CvPoint predict_pt = calc_point(predict_angle);float measurement_angle;CvPoint measurement_pt;cvRandSetRange( &rng, 0, 
sqrt(kalman->measurement_noise_cov->data.fl[0]), 0 );cvRand( &rng, measurement );/* generate measurement */
cvMatMulAdd( kalman->measurement_matrix, 
state, measurement, measurement );measurement_angle = measurement->data.fl[0];measurement_pt = calc_point(measurement_angle);/* plot points */#define draw_cross( center, color, d )                                 \cvLine( img, cvPoint( center.x - d, center.y - d ),                \cvPoint( center.x + d, center.y + d ), color, 1, 0 ); \cvLine( img, cvPoint( center.x + d, center.y - d ),                \cvPoint( center.x - d, center.y + d ), color, 1, 0 )cvZero( img );draw_cross( state_pt, CV_RGB(255,255,255), 3 );draw_cross( measurement_pt, CV_RGB(255,0,0), 3 );draw_cross( predict_pt, CV_RGB(0,255,0), 3 );cvLine( img, state_pt, predict_pt, CV_RGB(255,255,0), 3, 0 );/* adjust Kalman filter state */cvKalmanCorrect( kalman, measurement );cvRandSetRange( &rng, 0, sqrt(kalman->process_noise_cov->data.fl[0]), 0 );cvRand( &rng, process_noise );cvMatMulAdd( kalman->transition_matrix, state, process_noise, state );cvShowImage( "Kalman", img );code = cvWaitKey( 100 );if( code > 0 ) /* break current simulation by pressing a key */break;}if( code == 27 ) /* exit by ESCAPE */break;}return 0;
}

更多推荐

opencv学习1 还有附带的kalman滤波

本文发布于:2024-02-16 22:47:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1691721.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:opencv   kalman

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!