使用cvThreshold检测范围

时间:2012-03-04 22:05:13

标签: opencv

基于this article皮肤的

可以使用hsv颜色空间近似检测,并且色调范围在6到38之间。

我试图使用cvThreshold的某种组合,特别是我认为这可能是正确的方法:

cvThreshold(planeH, planeH, 38, UCHAR_MAX, CV_THRESH_TRUNC);
cvThreshold(planeH, planeH, 6, UCHAR_MAX, CV_THRESH_BINARY_INV);

但它不起作用。 一些帮助?

2 个答案:

答案 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之间的像素)。