我试图将视频中的HSV帧传递给该函数,但该函数似乎并未对其做任何操作。我做错了什么?该函数应该遍历每个像素,并根据其色调范围将其设置为黑色或白色,留下一个二进制图像。相反,它似乎完全不会影响HSV图像...
谢谢PS抱歉的糟糕的代码格式,StackOverflow不允许我张贴原始格式。
void sort (IplImage *skinmask)
{
for (int row=0; row<=skinmask->height;row++)
{
uchar* pixelrow=(uchar*)(skinmask->imageData+(row*(skinmask->widthStep)));
for (int column=0; column<=skinmask->width; column++)
{
if (6<pixelrow[3*column]<36)
{
pixelrow[3*column]=256;
pixelrow[(3*column)+1]=256;
pixelrow[(3*column)+2]=256;
}
else
{
pixelrow[3*column]=0;
pixelrow[(3*column)+1]=0;
pixelrow[(3*column)+2]=0;
}
column++;
}
row++;
}
cvMorphologyEx(skinmask,skinmask,NULL,NULL,CV_MOP_CLOSE,1);
}发布于 2011-09-21 10:18:04
在OpenCV中,像逐个像素设置阈值这样的操作通常是错误的-有一些函数可以处理整个图像数组,这些函数更简单,并且已经针对速度进行了优化。
在这种情况下,首先尝试对图像进行splitting以分离出H/S/V通道,然后对色调通道进行threshold以获得蒙版(您可能必须使用两个蒙版的交集,您可以使用乘法或“按位与”)-结果蒙版是您的黑白图像。
(我意识到我链接到了C++文档,但我相信您可以在旧式的OpenCV文档中找到等效的函数)
更新
好的,我会试着写一些代码来说明我的意思。我还找到了我正在寻找的函数,它比阈值更好,它是InRangeS。这使您可以一次在所有通道上设置上限和下限,并将它们全部应用到您的蒙版中。
void HSVImageToMask(IplImage * image, cvMat * mask)
/* mask should be the same size as image, and of type CV_8UC1 */
/* e.g. cvMat * mask = cvCreateMat(image->width, image->height, CV8UC1); */
{
double hMin = 6;
double hMax = 36;
double sMin = 10; /* not sure what value you need */
double sMax = 245; /* not sure what value you need */
double vMin = 0;
double vMax = 255;
CvScalar hsvMin = cvScalar(hMin, sMin, vMin);
CvScalar hsvMax = cvScalar(hMax, sMax, vMax);
cvInRangeS(image, hsvMin, hsvMax, mask);
}PS。我用你的原始代码解决了这个问题--你应该使用255而不是256作为你的“白”值。不过,这种方法仍然更好:)
PPS。我们毕竟不需要它们,但为了将来的参考:
"bitwise and"
cvAnd(const CvArr* src1, const CvArr* src2, CvArr* dst)如果你有两个黑白面具,这将给你交叉点。使用cvOr获取联合。
https://stackoverflow.com/questions/7493484
复制相似问题