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