www.pudn.com > cond_japan.rar > cond_japan.C
#ifdef _CH_ #pragma package#endif #ifndef _EiC #include "cv.h" #include "highgui.h" #include "cxcore.h" #include #include #endif //■ 指定した座標の色を返す関数--------------------------------------------------- int getpixel(IplImage *image, int x, int y, int *h, int *s, int *v){ *h =(uchar) image->imageData[y *image->widthStep+x * image->nChannels]; *s =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 1]; *v =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 2]; return 0; } //-------------------------------------------------------------------------------- int main( int argc, char** argv ){ CvCapture* capture = 0; IplImage* image = 0; IplImage* HSV = 0; if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))){ capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 ); } else if( argc == 2 ){ capture = cvCaptureFromAVI( argv[1] ); } if( !capture ){ fprintf(stderr,"Could not initialize capturing...\n"); return -1; } printf( "Hot keys: \n" "\tESC - quit the program\n"); //■ ウィンドウ作成 cvNamedWindow("Normal", CV_WINDOW_AUTOSIZE ); //■ 构造体ConDens的作成------------------------------------------------- int DP=2; // 状态矢量(x,y)的次元 int MP=2; // 观测矢量(x,y)的次元 int SamplesNum=1000; // 样品的件数 CvConDensation* ConDens=cvCreateConDensation( DP, MP, SamplesNum ); //----------------------------------------------------------------------- //■ ConDens構造体の各サンプルの初期化----------------------------------- CvMat* lowerBound; // 各次元の下界を示すベクトル CvMat* upperBound; // 各次元の上界を示すベクトル lowerBound = cvCreateMat(2, 1, CV_32F); upperBound = cvCreateMat(2, 1, CV_32F); cvmSet( lowerBound, 0, 0, 0.0 ); cvmSet( upperBound, 0, 0, 320.0 ); cvmSet( lowerBound, 1, 0, 0.0 ); cvmSet( upperBound, 1, 0, 240.0 ); cvConDensInitSampleSet(ConDens, lowerBound, upperBound); //----------------------------------------------------------------------- //■ 状态变量的从初始化(画像中心追踪)|------------------------------ for(int i=0; i < SamplesNum; i++){ ConDens->flSamples[i][0]+=160.0; ConDens->flSamples[i][1]+=120.0; } //----------------------------------------------------------------------- //■ 状態遷移行列の初期化(ランダムウォーク)---------------------------- ConDens->DynamMatr[0]=1.0;ConDens->DynamMatr[1]=0.0; ConDens->DynamMatr[2]=0.0;ConDens->DynamMatr[3]=1.0; //----------------------------------------------------------------------- for(;;){ IplImage* frame = 0; int c; int X,Y,XX,YY; int H,S,V; frame = cvQueryFrame( capture ); if( !frame ){ break; } if( !image ){ image = cvCreateImage( cvGetSize(frame), 8, 3 ); image->origin = frame->origin; HSV = cvCreateImage( cvGetSize(frame), 8, 3 ); HSV->origin = frame->origin; } cvCopy( frame, image, 0 ); cvCvtColor(image ,HSV , CV_BGR2HSV); //■ 尤度の計算(未実装)--------------------------------------------------- for(int i=0; i < SamplesNum; i++){ X=(int)ConDens->flSamples[i][0]; Y=(int)ConDens->flSamples[i][1]; if(X>=0 && X<=320 && Y>=0 && Y<=240){ getpixel(HSV, X, Y, &H, &S, &V); if(H<=19 && S>=48){ // 肌色らしいか判定 cvCircle(image, cvPoint(X,Y), 2, CV_RGB(255,255,255), 1); ConDens->flConfidence[i]=1.0; } else{ ConDens->flConfidence[i]=0.0; } } else{ ConDens->flConfidence[i]=0.0; } } //-------------------------------------------------------------------------- //计算按照优秀度推定了的状态期望值| cvConDensUpdateByTime(ConDens); cvShowImage( "Normal", image ); c = cvWaitKey(1); if( c == 27 ){ break; } } //■ 後処理------------------------------------ cvReleaseImage(&image); cvReleaseImage(&HSV); cvReleaseConDensation(&ConDens); cvReleaseMat( &lowerBound ); cvReleaseMat( &upperBound ); cvReleaseCapture( &capture ); cvDestroyWindow("Normal"); //--------------------------------------------- return 0; } #ifdef _EiC main(1,"condensation.cpp"); #endif