首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视频处理OpenCV?

视频处理OpenCV?
EN

Stack Overflow用户
提问于 2011-09-21 09:02:14
回答 1查看 976关注 0票数 0

我试图将视频中的HSV帧传递给该函数,但该函数似乎并未对其做任何操作。我做错了什么?该函数应该遍历每个像素,并根据其色调范围将其设置为黑色或白色,留下一个二进制图像。相反,它似乎完全不会影响HSV图像...

谢谢PS抱歉的糟糕的代码格式,StackOverflow不允许我张贴原始格式。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-21 10:18:04

在OpenCV中,像逐个像素设置阈值这样的操作通常是错误的-有一些函数可以处理整个图像数组,这些函数更简单,并且已经针对速度进行了优化。

在这种情况下,首先尝试对图像进行splitting以分离出H/S/V通道,然后对色调通道进行threshold以获得蒙版(您可能必须使用两个蒙版的交集,您可以使用乘法或“按位与”)-结果蒙版是您的黑白图像。

(我意识到我链接到了C++文档,但我相信您可以在旧式的OpenCV文档中找到等效的函数)

更新

好的,我会试着写一些代码来说明我的意思。我还找到了我正在寻找的函数,它比阈值更好,它是InRangeS。这使您可以一次在所有通道上设置上限和下限,并将它们全部应用到您的蒙版中。

代码语言:javascript
复制
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"

代码语言:javascript
复制
cvAnd(const CvArr* src1, const CvArr* src2, CvArr* dst)

如果你有两个黑白面具,这将给你交叉点。使用cvOr获取联合。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7493484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档