我希望将现有的颜色检测从红色转换为灰色。我从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;
}
}
}
}
}
评论部分是我试图检测灰色区域,但它肯定不适合我。
答案 0 :(得分:0)
灰色的所有3个成分的属性大约相同。您可以检查所有3个颜色分量对之间的所有差异是否低于阈值:
pager.frame.size.width = CGFloat(pager.numberOfPages) * 17 - 14