任何人都可以向我解释这个opencv代码的一部分吗?

时间:2016-12-21 06:58:50

标签: c++ opencv

The original code is here

这是一个用于跟踪手势的opencv程序我试图弄清楚为什么这段代码的创建者需要c_lower和c_upper数组

发布的代码太多了,我主要想知道是否有人在此之前使用过这段代码的人比我更了解。

我想知道他为什么这样做:

void produceBinaries(MyImage *m) {
    Scalar lowerBound;
    Scalar upperBound;
    for (int i = 0; i<NSAMPLES; i++) {
        normalizeColors(m);
        lowerBound = Scalar(avgColor[i][0] - c_lower[i][0], avgColor[i][1] - c_lower[i][1], avgColor[i][2] - c_lower[i][2]);
        upperBound = Scalar(avgColor[i][0] + c_upper[i][0], avgColor[i][1] + c_upper[i][1], avgColor[i][2] + c_upper[i][2]);
        m->bwList.push_back(Mat(m->srcLR.rows, m->srcLR.cols, CV_8U));
        inRange(m->srcLR, lowerBound, upperBound, m->bwList[i]);
    }
    m->bwList[0].copyTo(m->bw);
    for (int i = 1; i<NSAMPLES; i++) {
        m->bw += m->bwList[i];
    }
    medianBlur(m->bw, m->bw, 7);
}

而不是这个

void produceBinaries(MyImage *m) {
    Scalar lowerBound;
    Scalar upperBound;
    for (int i = 0; i<NSAMPLES; i++) {
        normalizeColors(m);
        lowerBound = Scalar(avgColor[i][0] - 20, avgColor[i][1] - 20, avgColor[i][2] - 20);
        upperBound = Scalar(avgColor[i][0] + 20, avgColor[i][1] + 20, avgColor[i][2] + 20);
        m->bwList.push_back(Mat(m->srcLR.rows, m->srcLR.cols, CV_8U));
        inRange(m->srcLR, lowerBound, upperBound, m->bwList[i]);
    }
    m->bwList[0].copyTo(m->bw);
    for (int i = 1; i<NSAMPLES; i++) {
        m->bw += m->bwList[i];
    }
    medianBlur(m->bw, m->bw, 7);
}

This code can be found here

为什么他需要单独的c_lower和c_upper值来获得色调,饱和度和值?为什么不选择像20这样的任意数字?

如果有人能提供任何有用的帮助,那么这家伙多年来一直没有发布任何有关此代码的信息,所以我不希望他回复我。

1 个答案:

答案 0 :(得分:0)

因为这些边界由GUI中的用户控制而不是代码中的硬编码。它们被设置为initTrackbars中的初始值,以便稍后使用轨迹栏(一种滑块)进行控制。