在不使用轮廓提取的情况下提取最外边界

时间:2012-08-15 18:18:25

标签: c++ opencv

我正在开展一个项目,我手上有一个二进制图像(如下图所示),我想只提取边界来训练机器学习算法。

由于我实时实现了这一点,并且边界内可能存在大量错误轮廓,因此在opencv中使用轮廓提取技术会降低程序速度。

我尝试过使用形态学关闭操作,然后进行简单的边缘检测,但是我仍然在外边界内找到了很多信息。

enter image description here This is am example of the silhouette image extracted enter image description here enter image description here

我正在使用kinect传感器来跟踪手,因此使用预处理技术无法纠正这些误差值。

我试图解决这个问题的函数是:

Mat CvHandRegion::sampleBoundaryPoints(Mat input)
{
        Mat sampledOut;
sampledOut.create(input.rows, input.cols, CV_8U);
sampledOut.setTo(0);

for( int x = 0; x < input.cols; x += C_SAMPLING_STEP)
{
    for( int y = 0; y < input.rows; y += C_SAMPLING_STEP)
    {
        if(input.at<uchar>(y,x) == 255)
        {
            sampledOut.at<uchar>(y,x) = 255;
            break;
        }
    }
}

for( int x = 0; x < input.cols; x += C_SAMPLING_STEP)
{
    for( int y = input.rows-1; y > 0; y -= C_SAMPLING_STEP)
    {
        if(input.at<uchar>(y,x) == 255)
        {
            sampledOut.at<uchar>(y,x) = 255;
            break;
        }
    }
}

for( int y = 0; y < input.rows; y += C_SAMPLING_STEP)
{
    for( int x = 0; x < input.cols; x += C_SAMPLING_STEP)
    {
        if(input.at<uchar>(y,x) == 255)
        {
            sampledOut.at<uchar>(y,x) = 255;
            break;
        }
    }
}


for( int y = 0; y < input.rows; y += C_SAMPLING_STEP)
{
    for( int x = input.cols-1; x > 0; x -= C_SAMPLING_STEP)
    {
        if(input.at<uchar>(y,x) == 255)
        {
            sampledOut.at<uchar>(y,x) = 255;
            break;
        }
    }
}
return sampledOut;
    }

此处C_SAMPLING_STEP保持为4.并且想法是从各方面基本到达并在检测到从0到255的变化时终止循环。

还有其他方法可以更有效和更强大吗?

更新:我尝试使用不同的半径进行形态学关闭操作 使用大小(5,5)的MORPH_ELLIPSE,输出为:

enter image description here enter image description here

和尺寸(7,7)

enter image description here enter image description here

和尺寸(9,9)

enter image description here

这在一定程度上解决了这个问题,但我不确定使用哪种尺寸,因为数据中的噪音变化很大(取决于手的姿势)。

0 个答案:

没有答案