检测帧中的灰色/烟雾区域

时间:2016-11-03 12:21:39

标签: c++ opencv color-detection

我希望将现有的颜色检测从红色转换为灰色。我从this project(火焰检测系统)中获取了代码

我试图实现自己的算法,但我认为我并没有接近我想要实现的目标。我从this link

获得了算法

以下是原始代码片段,略有修改:

void TargetExtractor::colorDetect(int redThreshold, double saturationThreshold) {
    Mat temp;
    GaussianBlur(mFrame, temp, Size(3, 3), 0);
    uchar grayThreshold = 80;

    for (int i = 0; i < temp.rows; i++) {
        for (int j = 0; j < temp.cols; j++) {
            if (mMask.at<uchar>(i, j) == 255) {
                Vec3b& v = temp.at<Vec3b>(i, j);
                uchar b = v[0];
                uchar g = v[1];
                uchar r = v[2];
                //if (abs(r - g) < grayThreshold) {
                //  mMask.at<uchar>(i, j) = 0;
                //}
                double s = 1 - 3.0 * min(b, min(g, r)) / (b + g + r);
                if (!(r > redThreshold && r >= g && g > b &&
                    s >= ((255 - r) * saturationThreshold / redThreshold))) {
                    mMask.at<uchar>(i, j) = 0;
                }
            }
        }
    }
}

评论部分是我试图检测灰色区域,但它肯定不适合我。

检测原始代码中的移动红色对象:

moving red object

检测移动的灰色物体:

moving gray object

1 个答案:

答案 0 :(得分:0)

灰色的所有3个成分的属性大约相同。您可以检查所有3个颜色分量对之间的所有差异是否低于阈值:

pager.frame.size.width = CGFloat(pager.numberOfPages) * 17 - 14