Dear Jihad anwar
Here is source code you asking.
I don't remember equation about particle filter well now.
But source code is still run well. ^^
I hope to help your study.
Note. Opencv 2.4.9 and 32 bit.
Thank you.
#include < iostream> #include < vector> #include < stdio.h> #include < opencv2\opencv.hpp> #include < opencv2\legacy\legacy.hpp> #ifdef _DEBUG #pragma comment(lib, "opencv_core249d.lib") #pragma comment(lib, "opencv_imgproc249d.lib") //MAT processing #pragma comment(lib, "opencv_objdetect249d.lib") //HOGDescriptor //#pragma comment(lib, "opencv_gpu249d.lib") //#pragma comment(lib, "opencv_features2d249d.lib") #pragma comment(lib, "opencv_highgui249d.lib") #pragma comment(lib, "opencv_ml249d.lib") //#pragma comment(lib, "opencv_stitching249d.lib"); //#pragma comment(lib, "opencv_nonfree249d.lib"); #pragma comment(lib, "opencv_video249d.lib") #pragma comment(lib, "opencv_legacy249d.lib") #else #pragma comment(lib, "opencv_core249.lib") #pragma comment(lib, "opencv_imgproc249.lib") #pragma comment(lib, "opencv_objdetect249.lib") //#pragma comment(lib, "opencv_gpu249.lib") //#pragma comment(lib, "opencv_features2d249.lib") #pragma comment(lib, "opencv_highgui249.lib") #pragma comment(lib, "opencv_ml249.lib") //#pragma comment(lib, "opencv_stitching249.lib"); //#pragma comment(lib, "opencv_nonfree249.lib"); #pragma comment(lib, "opencv_video249d.lib") #endif using namespace cv; using namespace std; // (1) functions for calculating the likelihood float calc_likelihood (IplImage * img, int x, int y) { float b, g, r; float dist = 0.0, sigma = 50.0; b = img->imageData[img->widthStep * y + x * 3]; //B g = img->imageData[img->widthStep * y + x * 3 + 1]; //G r = img->imageData[img->widthStep * y + x * 3 + 2]; //R dist = sqrt (b * b + g * g + (255.0 - r) * (255.0 - r)); return 1.0 / (sqrt (2.0 * CV_PI) * sigma) * expf (-dist * dist / (2.0 * sigma * sigma)); } void ProccTimePrint( unsigned long Atime , string msg) { unsigned long Btime=0; float sec, fps; Btime = getTickCount(); sec = (Btime - Atime)/getTickFrequency(); fps = 1/sec; printf("%s %.4lf(sec) / %.4lf(fps) \n", msg.c_str(), sec, fps ); } int main () { float TakeTime; unsigned long Atime, Btime; int i, c; double w = 0.0, h = 0.0; CvCapture *capture = 0; IplImage *frame = 0; int n_stat = 4; int n_particle = 1000; vector< float > vx(n_particle); vector< float > vy(n_particle); CvConDensation *cond = 0; CvMat *lowerBound = 0; CvMat *upperBound = 0; int xx, yy; // (2)you want to create a capture structure with respect to the camera with the specified number by the command argument capture = cvCreateCameraCapture(0); // (3)The one frame captured, and obtains the capture size. frame = cvQueryFrame (capture); w = frame->width; h = frame->height; cvNamedWindow ("Condensation", CV_WINDOW_AUTOSIZE); // (4)Condensation create a structure. cond = cvCreateConDensation (n_stat, 0, n_particle); // (5) it will specify the minimum and maximum values of the state vector can be taken for each dimension. lowerBound = cvCreateMat (4, 1, CV_32FC1); upperBound = cvCreateMat (4, 1, CV_32FC1); cvmSet (lowerBound, 0, 0, 0.0); cvmSet (lowerBound, 1, 0, 0.0); cvmSet (lowerBound, 2, 0, -10); //-10.0); cvmSet (lowerBound, 3, 0, -10); //-10.0); cvmSet (upperBound, 0, 0, w); cvmSet (upperBound, 1, 0, h); cvmSet (upperBound, 2, 0, 10); //10.0); cvmSet (upperBound, 3, 0, 10); //10.0); // (6)Condensation Initialize the structure cvConDensInitSampleSet (cond, lowerBound, upperBound); // (7)ConDensation Specify the dynamics of the state vector in the algorithm cond->DynamMatr[0] = 1.0; cond->DynamMatr[1] = 0.0; cond->DynamMatr[2] = 1.0; cond->DynamMatr[3] = 0.0; cond->DynamMatr[4] = 0.0; cond->DynamMatr[5] = 1.0; cond->DynamMatr[6] = 0.0; cond->DynamMatr[7] = 1.0; cond->DynamMatr[8] = 0.0; cond->DynamMatr[9] = 0.0; cond->DynamMatr[10] = 1.0; cond->DynamMatr[11] = 0.0; cond->DynamMatr[12] = 0.0; cond->DynamMatr[13] = 0.0; cond->DynamMatr[14] = 0.0; cond->DynamMatr[15] = 1.0; // (8)re-set the noise parameters. while (1) { frame = cvQueryFrame (capture); Atime = getTickCount(); //μμ μκ° float a=0,b=0,c=0,d=0,e=0; // (9) It calculates the likelihood for each particle. for (i = 0; i < n_particle; i++) { xx = (int) (cond->flSamples[i][0]); yy = (int) (cond->flSamples[i][1]); vx[i] = cond->flSamples[i][0]; vy[i] = cond->flSamples[i][1]; if (xx < 0 || xx >= w || yy < 0 || yy >= h) { cond->flConfidence[i] = 0.0; } else { cond->flConfidence[i] = calc_likelihood (frame, xx, yy); cvCircle (frame, cvPoint (xx, yy), 1, CV_RGB (0, 0, 255), -1); } } // (10) estimate the state of the next model cvConDensUpdateByTime (cond); printf("crrection \n"); ProccTimePrint( Atime , "time :"); //μ²λ¦¬μκ° μΆλ ₯ cv::Point statePt(cond->State[0], cond->State[1]); cvCircle (frame, statePt, 5, CV_RGB (255, 255, 255), 5); printf("-----------\n"); cvShowImage ("Condensation", frame); if (cvWaitKey (10) > 10 ) break; } cvDestroyWindow ("Condensation"); cvReleaseCapture (&capture); cvReleaseConDensation (&cond); cvReleaseMat (&lowerBound); cvReleaseMat (&upperBound); return 0; }
I want to tell you :
ReplyDeleteThank you so match for you recommendation and for you replay.
Thank you.
Delete