可以使用hsv颜色空间近似检测,并且色调范围在6到38之间。
我试图使用cvThreshold的某种组合,特别是我认为这可能是正确的方法:
cvThreshold(planeH, planeH, 38, UCHAR_MAX, CV_THRESH_TRUNC);
cvThreshold(planeH, planeH, 6, UCHAR_MAX, CV_THRESH_BINARY_INV);
但它不起作用。 一些帮助?
答案 0 :(得分:4)
我相信你真正追求的功能是cvInRange功能。此功能允许您同时指定多个间隔。
例如,
CvMat* skinMask = cvCreateMat(...);
cvInRange(hsvImage, CvScalar(6, loS, loV), CvScalar(38, hiS, hiV), skinMask);
其中loS, loV, hiS, hiV
分别是S和V通道的下限和上限。
Here是我使用inRange
的另一个答案。如果您可以使用C ++接口,我建议通过C接口,因为它具有更多功能,并且是OpenCV的积极维护方面。
答案 1 :(得分:1)
我不确定您是否可以安全地使用相同的图像(planeH)作为函数的输入和输出。你可能会得到边框效果。更好地使用临时图像
另外,如果你看这里:http://www710.univ-lyon1.fr/~bouakaz/OpenCV-0.9.5/docs/ref/OpenCVRef_ImageProcessing.htm#decl_cvThreshold你会看到cvthreshold的输出是二进制图像(值或0),如果你没有使用CV_THRESH_TOZERO。所以你的代码是有偏见的,因为在操作平面H之后应该只包含两个不同的值
你应该做的是使用CV_THRESH_TOZERO,或者对两个不同的图像执行每个操作,然后对两个结果执行OR运算(结果是一个二进制图像,1表示6到38之间的像素)。