Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不使用轮廓提取的情况下提取最外层边界_C++_Opencv - Fatal编程技术网

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

C++ 在不使用轮廓提取的情况下提取最外层边界,c++,opencv,C++,Opencv,我正在做一个项目,在那里我有一个二值图像,就像手下面的一个,我只想提取边界来训练机器学习算法 由于我是实时实现的,边界内可能有很多错误轮廓,因此在opencv中使用轮廓提取技术会减慢程序的速度 我尝试过使用形态学闭合操作,然后进行简单的边缘检测,但是我仍然在外部边界内发现了很多信息 我使用kinect传感器跟踪手,因此无法使用预处理技术纠正这些错误值 我为解决此问题而编写的函数是: Mat CvHandRegion::sampleBoundaryPoints(Mat input) {

我正在做一个项目,在那里我有一个二值图像,就像手下面的一个,我只想提取边界来训练机器学习算法

由于我是实时实现的,边界内可能有很多错误轮廓,因此在opencv中使用轮廓提取技术会减慢程序的速度

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

我使用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_采样_步骤保持为4。这个想法基本上是从四面八方到达,一旦检测到从0到255的变化,就终止循环

还有其他更有效、更稳健的方法吗

更新:我尝试使用不同的半径进行形态闭合操作 尺寸为5,5的变形椭圆的输出为:

和7,7号

和尺寸9,9


这在某种程度上解决了这个问题,但是我不确定使用哪种尺寸,因为数据中的噪声根据手的姿势变化很大

你试过改变关闭操作的半径吗?你发布的图片在关闭后看起来会很干净。谢谢你指出,我尝试了不同的值,它使用不同的数据处理不同的半径。这样就解决了你的问题?还是仍然存在问题?手的大小在图像中是否保持相对恒定?你可以看看白与黑的比例。。。如果没有,也许你可以看看包围所有白点的粗糙边界框内的白黑比,这样你可以尝试传递findContours参数,让它只找到外部控件,这可能会更快,然后你只需要确保手周围有一个坚实的白色边框,里面的洞很好。