मैं अपने चेहरे का पता लगाने कार्यक्रम के प्रदर्शन में सुधार के लिए अब कुछ दिनों के लिए कलमान फ़िल्टर के संचालन का अध्ययन कर रहा हूं। मैंने एकत्र की गई जानकारी से मैंने एक कोड रखा है। कलमान फ़िल्टर भाग के लिए कोड निम्नानुसार है।चार इनपुट पैरामीटर के साथ काल्मन फ़िल्टर
int Kalman(int X,int faceWidth,int Y,int faceHeight, IplImage *img1){
CvRandState rng;
const float T = 0.1;
// Initialize Kalman filter object, window, number generator, etc
cvRandInit(&rng, 0, 1, -1, CV_RAND_UNI);
//IplImage* img = cvCreateImage(cvSize(500,500), 8, 3);
CvKalman* kalman = cvCreateKalman(4, 4, 0 );
// Initializing with random guesses
// state x_k
CvMat* state = cvCreateMat(4, 1, CV_32FC1);
cvRandSetRange(&rng, 0, 0.1, 0);
rng.disttype = CV_RAND_NORMAL;
cvRand(&rng, state);
// Process noise w_k
CvMat* process_noise = cvCreateMat(4, 1, CV_32FC1);
// Measurement z_k
CvMat* measurement = cvCreateMat(4, 1, CV_32FC1);
cvZero(measurement);
/* create matrix data */
const float A[] = {
1, 0, T, 0,
0, 1, 0, T,
0, 0, 1, 0,
0, 0, 0, 1
};
const float H[] = {
1, 0, 0, 0,
0, 0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0
};
//Didn't use this matrix in the end as it gave an error:'ambiguous call to overloaded function'
/* const float P[] = {
pow(320,2), pow(320,2)/T, 0, 0,
pow(320,2)/T, pow(320,2)/pow(T,2), 0, 0,
0, 0, pow(240,2), pow(240,2)/T,
0, 0, pow(240,2)/T, pow(240,2)/pow(T,2)
}; */
const float Q[] = {
pow(T,3)/3, pow(T,2)/2, 0, 0,
pow(T,2)/2, T, 0, 0,
0, 0, pow(T,3)/3, pow(T,2)/2,
0, 0, pow(T,2)/2, T
};
const float R[] = {
1, 0, 0, 0,
0, 0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0
};
//Copy created matrices into kalman structure
memcpy(kalman->transition_matrix->data.fl, A, sizeof(A));
memcpy(kalman->measurement_matrix->data.fl, H, sizeof(H));
memcpy(kalman->process_noise_cov->data.fl, Q, sizeof(Q));
//memcpy(kalman->error_cov_post->data.fl, P, sizeof(P));
memcpy(kalman->measurement_noise_cov->data.fl, R, sizeof(R));
//Initialize other Kalman Filter parameters
//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(1e-5));
/* choose initial state */
kalman->state_post->data.fl[0]=X;
kalman->state_post->data.fl[1]=faceWidth;
kalman->state_post->data.fl[2]=Y;
kalman->state_post->data.fl[3]=faceHeight;
//cvRand(&rng, kalman->state_post);
/* predict position of point */
const CvMat* prediction=cvKalmanPredict(kalman,0);
//generate measurement (z_k)
cvRandSetRange(&rng, 0, sqrt(kalman->measurement_noise_cov->data.fl[0]), 0);
cvRand(&rng, measurement);
cvMatMulAdd(kalman->measurement_matrix, state, measurement, measurement);
//Draw rectangles in detected face location
cvRectangle(img1,
cvPoint(kalman->state_post->data.fl[0], kalman->state_post->data.fl[2]),
cvPoint(kalman->state_post->data.fl[1], kalman->state_post->data.fl[3]),
CV_RGB(0, 255, 0), 1, 8, 0);
cvRectangle(img1,
cvPoint(prediction->data.fl[0], prediction->data.fl[2]),
cvPoint(prediction->data.fl[1], prediction->data.fl[3]),
CV_RGB(0, 0, 255), 1, 8, 0);
cvShowImage("Kalman",img1);
//adjust kalman filter state
cvKalmanCorrect(kalman,measurement);
cvMatMulAdd(kalman->transition_matrix, state, process_noise, state);
return 0;
}
चेहरे का पता लगाने भाग (दिखाया नहीं गया) में, चेहरे का पता लगाने के लिए एक बॉक्स खींचा जाता है। 'एक्स, वाई, फेसविड्थ और फेसहेइट' बॉक्स के निर्देशांक हैं और चौड़ाई और ऊंचाई कलमैन फ़िल्टर में गुजरती है। 'img1' एक वीडियो का वर्तमान फ्रेम है।
परिणाम:
हालांकि मैं 'state_post' और 'भविष्यवाणी' डेटा (कोड में देखा जाता है) से दो नए आयतों मिलता है, उनमें से कोई भी बिना तैयार प्रारंभिक बॉक्स के अलावा कोई और अधिक स्थिर होने लगते हैं कलमैन फ़िल्टर। इस चार इनपुट मामले के लिए सही
- मैट्रिक्स प्रारंभ (संक्रमण मैट्रिक्स A, माप मैट्रिक्स एच आदि) कर रहे हैं,:
यहाँ मेरी सवाल कर रहे हैं? (उदाहरण के लिए चार इनपुट के लिए 4 * 4 matrices?)
- क्या हम प्रत्येक मैट्रिक्स को पहचान मैट्रिक्स के रूप में सेट नहीं कर सकते?
- क्या पद्धति मैंने सैद्धांतिक रूप से सही आयत की साजिश तक पालन की है? मैंने उदाहरणों का पालन किया this और पुस्तक 'लर्निंग ओपनसीवी' जो बाहरी इनपुट का उपयोग नहीं करती है।
इसके बारे में कोई भी मदद की सराहना की जाएगी!
जानकारीपूर्ण उत्तर के लिए बहुत बहुत धन्यवाद! मुझे कुछ भी बदलने की ज़रूरत नहीं थी क्योंकि मैंने इस चरण के लिए कलमान फ़िल्टर छोड़ने का फैसला किया था। लेकिन मुझे यकीन है कि कोई आपके उत्तर को उपयोगी पाएगा! एक बार फिर धन्यवाद। – Kavo