Обнаружение серых / дымовых областей от кадра

Я хотел бы преобразовать это существующее определение цвета из красного в серый цвет. Я взял код из этот проект (Система обнаружения пламени)

Я пытался реализовать свой собственный алгоритм, но я думаю, что я не близко к тому, чего я пытаюсь достичь. Я получаю алгоритм от эта ссылка

Ниже приведен фрагмент исходного кода с небольшой модификацией:

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

Закомментированная часть — моя попытка обнаружить серые области, но она определенно не работает для меня.


Обнаружение движущихся красных объектов из исходного кода:

движущийся красный объект

Обнаружение движущихся серых объектов:

движущийся серый объект

0

Решение

Серый цвет обладает свойством того, что все 3 компонента примерно одинаковы. Вы можете проверить, что все различия между всеми парами 3 цветовых компонентов ниже порога:

if (abs(r - g) < grayThreshold && abs(r - b) < grayThreshold && abs(b - g) < grayThreshold) {
mMask.at<uchar>(i, j) = 0;
}
0

Другие решения

Других решений пока нет …