Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ opencv中基于卡尔曼滤波的鼠标跟踪_C++_Opencv_Tracking_Kalman Filter - Fatal编程技术网

C++ opencv中基于卡尔曼滤波的鼠标跟踪

C++ opencv中基于卡尔曼滤波的鼠标跟踪,c++,opencv,tracking,kalman-filter,C++,Opencv,Tracking,Kalman Filter,我写了一个使用卡尔曼滤波器跟踪鼠标指针的代码。但是它给出了一些错误。请帮助我 enter code here enter code here #include "cv.h" #include "highgui.h" #include <iostream> #include <vector> using namespace std; CvPoint point=cvPoint(-1,-1); CvPoint last_point; vector<CvPoin

我写了一个使用卡尔曼滤波器跟踪鼠标指针的代码。但是它给出了一些错误。请帮助我

enter code here enter code here


#include "cv.h"
#include "highgui.h"
#include <iostream>
#include <vector>

using namespace std;

CvPoint point=cvPoint(-1,-1);
CvPoint last_point;

vector<CvPoint> mousev,kalmanv;

   void my_mouse_callback(int event, int x, int y, int flags, void* param)
 {
CV_EVENT_LBUTTONDBLCLK;
last_point=point;
point=cvPoint(x,y);
 }

IplImage *img;

int main()
{ 
// Initialize Kalman filter object, window, number generator, etc
cvNamedWindow( "Kalman", 1 );

IplImage* img = cvCreateImage( cvSize(500,500), 8, 3 );

CvKalman* kalman = cvCreateKalman( 4, 2, 0 );

CvMat* state = cvCreateMat( 4, 1, CV_32FC1 );

CvMat* processnoise=cvCreateMat(4,1,CV_32FC1);

CvMat* measurement =cvCreateMat(2,1,CV_8SC1);

char code = (char)-1;

cvSetMouseCallback("kalman",my_mouse_callback,NULL);

while(1)
{
  if(point.x<0 || point.y<0)

  {
      cvShowImage("kalman",img);
       cvWaitKey(30);
        continue;
   }
  const float F1[] = {point.x,point.y,0,0};
  memcpy(kalman->state_pre->data.fl,F1,sizeof(F1));

  float vals[] = {1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1};
  CvMat tran;
  cvInitMatHeader(&tran,4,4,CV_32FC1,vals);
  memcpy(kalman->transition_matrix->data.fl,tran,sizeof(tran));

 cvSetIdentity( kalman->measurement_matrix);
 cvSetIdentity( kalman->process_noise_cov, cvRealScalar(1e-5) );
 cvSetIdentity( kalman->measurement_noise_cov, cvRealScalar(1e-1) );
 cvSetIdentity( kalman->error_cov_post, cvRealScalar(1) );

 mousev.clear();
 kalmanv.clear();

 while(1)
 {
     const CvMat* prediction = cvKalmanPredict(kalman,0);

     CvPoint predictionPt = cvPoint(prediction[0],prediction[0]);

     measurement[0]= point.x;
     measurement[1] = point.y;

     CvPoint measPt = cvPoint(measurement[0],measurement[1]);

     mousev.push_back(measPt);

     const CvMat* estimated = cvKalmanCorrect( kalman, measurement);

     CvPoint statePt=cvPoint(estimated[0],estimated[1]);
     kalmanv.push_back(statePt);

     cvLine( img, cvPoint(statePt.x - 5, statePt.y - 5 ),cvPoint( statePt.x + 5, statePt.y + 5 ), cvScalar(255,255,255), 2,8); 
     cvLine( img, cvPoint(statePt.x + 5, statePt.y - 5 ),cvPoint( statePt.x - 5, statePt.y + 5 ), cvScalar(255,255,255), 2,8);

     cvLine( img, cvPoint(measPt.x - 5, measPt.y - 5 ),cvPoint( measPt.x + 5, measPt.y + 5 ), cvScalar(255,255,255), 2,8); 
     cvLine( img, cvPoint(measPt.x + 5, measPt.y - 5 ),cvPoint( measPt.x - 5, measPt.y + 5 ), cvScalar(255,255,255), 2,8);

     for (int i = 0; i < mousev.size()-1; i++) 
    {
            cvLine(img, mousev[i], mousev[i+1], cvScalar(255,255,0), 1);
    }

     for (int i = 0; i < kalmanv.size()-1; i++) 
    {
            cvLine(img, kalmanv[i], kalmanv[i+1], cvScalar(0,255,0), 1);
    }
        cvShowImage( "mouse kalman", img );
        code = (char)cvWaitKey(100);
        if( code > 0 )
            break;
 }
  if( code == 27 || code == 'q' || code == 'Q' )
        break;
}

return 0;
}
错误3错误C2664:“memcpy”:无法从转换参数2 “CvMat”到“const void*”c:\users\anay\documents\visualstudio 2008\projects\mission\u impossable\u 1\mission\u impossable\u 1\kalman\u filter.cpp 56任务不可能1

在C++中不同于C++,你必须显式地将指针指向指针,以使其无效。 目前您有:

CvMat tran;
memcpy(kalman->transition_matrix->data.fl,tran,sizeof(tran));
请尝试以下方法:

CvMat* tran=new CvMat;
memcpy(static_cast<void*>(kalman->transition_matrix->data.fl),static_cast<void*>(tran),sizeof(tran));
下一步:

错误4错误C2664:“cvPoint”:无法从转换参数1 “const CvMat”到“int”


我真的很想帮你,但是请附上你的课程点代码

我使用了你提到的memcpy函数。但是它仍然给出错误。错误:错误3错误C2440:“static_cast”:无法从“CvMat”转换为“void*”c:\users\anay\documents\visualstudio 2008\projects\mission_unability\u 1\mission_unability\u 1\kalman_filter.cpp 56 mission_unability\u 1;嘿,非常感谢。。。。。!!!现在代码正在运行…节省了我宝贵的时间…再次感谢。。。。!!!!
CvMat tran;
memcpy(kalman->transition_matrix->data.fl,tran,sizeof(tran));
CvMat* tran=new CvMat;
memcpy(static_cast<void*>(kalman->transition_matrix->data.fl),static_cast<void*>(tran),sizeof(tran));