10

私がやろうとしていることは次のとおりです。

色付きのオブジェクトを修正します。camshift を使用したヒストグラム逆投影アプローチを使用して、ビデオ フレーム全体で追跡します。次のコードを使用すると、常にスキンが検出されます。私はひどく単純な間違いを犯していることを理解しています。どなたか指摘していただけると助かります。

//I have included only the integral parts of code. There are no compilation errors.

    int lowerH =80, upperH =100, lowerS =80, upperS =255, lowerV =80, upperV =255;

    CvScalar output_min =cvScalar(lowerH, lowerS, lowerV, 0); //Color Track
    CvScalar output_max =cvScalar(upperH, upperS, upperV, 0);

    CvScalar output_min2 =cvScalar(0, lowerS, lowerV, 0); //Color Track
    CvScalar output_max2 =cvScalar(180, upperS, upperV, 0);

    while(true){
        frame =cvQueryFrame(capture);

        cvCvtColor(frame, output, CV_BGR2HSV);
        cvInRangeS(output, output_min, output_max, output_mask);

        blobs =CBlobResult(output_mask, NULL, 0);
        blobs.Filter(blobs, B_EXCLUDE, CBlobGetArea(), B_LESS, 35);

        int num_blobs =blobs.GetNumBlobs();
        for(int i=0; i<num_blobs;++i){
            currentBlob = blobs.GetBlob( i );                
            sortedBlobs.push_back(currentBlob);
        }

        if(num_blobs){
            sort(sortedBlobs.begin(), sortedBlobs.end(), local::sortBlobs);
            CvRect blobRect =sortedBlobs[0].GetBoundingBox();

            initX =blobRect.x;
            initY =blobRect.y;
            initWidth =blobRect.width;
            initHeight =blobRect.height;
            initFrame =cvCloneImage(frame);
        }

            int c=cvWaitKey(40);
        if((char)c ==27)break;
    }

    CvRect selection;
    selection.x = initX;
    selection.y = initY;
    selection.width = initWidth;
    selection.height = initHeight;

    CvHistogram *hist;
    int hist_bins = 30;          
    float hist_range[] = {0, 180}; 
    float* range = hist_range;
    hist = cvCreateHist(1, &hist_bins, CV_HIST_ARRAY, &range, 1);           

    cvCvtColor(initFrame, output, CV_BGR2HSV);
    cvInRangeS(output, output_min2, output_max2, output_mask);
    cvSplit(output, hue, 0, 0, 0);

    cvSetImageROI(hue, selection);
    cvSetImageROI(output_mask, selection);

    cvCalcHist(&hue, hist, 0, output_mask);
    float max_val = 0.f;
    cvGetMinMaxHistValue(hist, 0, &max_val, 0, 0 );
    cvConvertScale(hist->bins, hist->bins,
                 max_val ? 255.0/max_val : 0, 0);

    cvResetImageROI(hue);
    cvResetImageROI(output_mask);


    CvBox2D curr_box;
    CvRect prev_rect =selection;
    CvConnectedComp components;
    bool rectFlag =false;
    CvPoint Pt =cvPoint(0,0), prevPt =cvPoint(0,0);
    int clearCounter =0;
    while(true){
        frame =cvQueryFrame(capture);
        if(!frame)break;

        cvCvtColor(frame, output, CV_BGR2HSV);
        cvInRangeS(output, output_min2, output_max2, output_mask);
        cvSplit(output, hue, 0, 0, 0);

        cvCalcBackProject(&hue, prob, hist);
        cvAnd(prob, output_mask, prob, 0);

        cvCamShift(prob, prev_rect, cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 20, 1), &components, &curr_box);

        prev_rect = components.rect;
        curr_box.angle = -curr_box.angle;

        cvEllipseBox(frame, curr_box, CV_RGB(255,0,0), 3, CV_AA, 0);

        int c=cvWaitKey(40);
        if((char)c ==27)break;
    }

編集:

コードの編集部分を確認してください。ヒストグラムの作成中に、マスクの色相値を 0 ~ 180 の範囲で使用しています。縮小された範囲 80 ~ 100 を使用すると、コンポーネントと curr_box でガベージ値が取得されます。

UPDATE : 出力画像

これは最初に検出された緑色のブロブであり、記録全体で追跡する必要があります。

これは最初に検出された緑色のブロブであり、記録全体で追跡する必要があります

これが起こることです。緑のブロブはマスク イメージで完全に黒く塗りつぶされ、代わりに肌が追跡されます。

これが起こることです。 緑のブロブはマスク イメージで完全に黒く塗りつぶされ、代わりに肌が追跡されます。

4

1 に答える 1

6

まず最初に、すべての混乱についてお詫び申し上げます。コードに非常にばかげたバグがあります。塗りつぶされた赤い長方形を元のフレームに配置した後、元のフレームのクローンを作成しています。

    CvPoint pt1, pt2;
    pt1.x = blobRect.x;  
    pt1.y = blobRect.y;  
    pt2.x = blobRect.x + blobRect.width;  
    pt2.y = blobRect.y + blobRect.height;

    cvRectangle( frame, pt1, pt2, cvScalar(0, 0, 255, 0), CV_FILLED, 8, 0 );

    initX =blobRect.x;
    initY =blobRect.y;
    initWidth =blobRect.width;
    initHeight =blobRect.height;
    initFrame =cvCloneImage(frame);

したがって、作成されるヒストグラムは常に赤色用です。解決策は簡単です。

于 2013-06-10T09:07:28.520 に答える