c++ - openCV 中的彩色对象跟踪不断检测皮肤

标签 c++ c algorithm opencv image-processing

我打算做的事情如下:

固定一个有颜色的物体。使用带有 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 中得到垃圾值。

更新: 输出图片

这是最初检测到的绿色 Blob ,应在整个记录过程中进行跟踪。

This is the green blob detected initially and should be tracked throughout the recording

事情是这样的。蒙版图像中的绿色 Blob 完全变黑,而是跟踪皮肤。

This is what happens. The green blob is completely blacked out in the mask image and instead the skin is tracked

最佳答案

首先,对于所有的困惑表示歉意。代码中有一个非常愚蠢的错误。在将填充的红色矩形放置到原始框架上后,我正在克隆原始框架。

    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);

因此,创建的直方图始终是红色的。解决方案很简单。

关于c++ - openCV 中的彩色对象跟踪不断检测皮肤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16985375/

相关文章:

c - 如何在 C 中创建 bcrypt 哈希并存储它们

c - 如何并行斐波那契数列直到 10^5 项

c - 目标文件的多重定义

algorithm - 当集合不相交时,是否有类似于联合查找的交集查找算法?

algorithm - 是否需要特征缩放

来自 VS2005 的 C++ 编译器

c++ - 如何创建虚拟文件?

c++ - Clang 找不到 `-fprebuilt-module-path` 的 C++ 模块

c++ - 向项目添加类后对 'main' 的 undefined reference

应用于配对序列时有关快速 union 算法的困惑 : 1-2, 2-3,3-4