Opencv 轮廓分割

Opencv 轮廓分割,opencv,contour,image-segmentation,opencv-contour,Opencv,Contour,Image Segmentation,Opencv Contour,我有一个由曲线段和直线段组成的轮廓。是否有可能将轮廓分割为弯曲部分和狭长部分? 这是一个轮廓的例子 我希望有一个这样的细分: 你知道我怎样才能解决这样的问题吗 非常感谢并致以最诚挚的问候是的,我得到了带有@PSchn链接的解决方案。我只是通过轮廓点定义了一个边界。边界下的所有东西都是“曲线段”,其他所有东西都是直线段。谢谢你的帮助 vector<double> getCurvature(vector<Point> const& tContourPoints,

我有一个由曲线段和直线段组成的轮廓。是否有可能将轮廓分割为弯曲部分和狭长部分? 这是一个轮廓的例子

我希望有一个这样的细分:

你知道我怎样才能解决这样的问题吗


非常感谢并致以最诚挚的问候

是的,我得到了带有@PSchn链接的解决方案。我只是通过轮廓点定义了一个边界。边界下的所有东西都是“曲线段”,其他所有东西都是直线段。谢谢你的帮助

vector<double> getCurvature(vector<Point> const& tContourPoints, int tStepSize)
{
int iplus;
int iminus;

double acurvature;
double adivisor;

Point2f pplus;
Point2f pminus;
// erste Ableitung
Point2f a1stDerivative;
// zweite Ableitung
Point2f a2ndDerivative;

vector< double > rVecCurvature( tContourPoints.size() );

if ((int)tContourPoints.size() < tStepSize)
{
    return rVecCurvature;
}

for (int i = 0; i < (int)tContourPoints.size(); i++ )
{
    const Point2f& pos = tContourPoints[i];

    iminus  = i-tStepSize;
    iplus   = i+tStepSize;

    if(iminus < 0)
    {
        pminus = tContourPoints[iminus + tContourPoints.size()];
    }
    else
    {
        pminus = tContourPoints[iminus];
    }

    if(iplus  > (int)tContourPoints.size())
    {
        pplus = tContourPoints[iplus - (int)tContourPoints.size()];
    }
    else
    {
        pplus = tContourPoints[iplus];
    }

    a1stDerivative.x = (pplus.x -           pminus.x) / ( iplus-iminus);
    a1stDerivative.y = (pplus.y -           pminus.y) / ( iplus-iminus);
    a2ndDerivative.x = (pplus.x - 2*pos.x + pminus.x) / ((iplus-iminus)/2*(iplus-iminus)/2);
    a2ndDerivative.y = (pplus.y - 2*pos.y + pminus.y) / ((iplus-iminus)/2*(iplus-iminus)/2);


    adivisor = a2ndDerivative.x*a2ndDerivative.x + a2ndDerivative.y*a2ndDerivative.y;
    if (  abs(adivisor) > 10e-8 )
    {
        acurvature =   abs(a2ndDerivative.y*a1stDerivative.x - a2ndDerivative.x*a1stDerivative.y) / pow(adivisor, 3.0/2.0 )  ;
    }
    else
    {
        acurvature =  numeric_limits<double>::infinity();
    }

    rVecCurvature[i] = acurvature;
}
return rVecCurvature;
}
vector getCurvature(vector const&tContourPoints,int-tStepSize)
{
int-iplus;
int iminus;
双针;
双遮阳板;
点2f-pplus;
点2f pminus;
//即兴表演
点2f a1st导数;
//茨威特阿贝利通
第2f点a2nd导数;
向量rVecCurvature(tContourPoints.size());
if((int)tContourPoints.size()(int)tContourPoints.size())
{
pplus=tContourPoints[iplus-(int)tContourPoints.size()];
}
其他的
{
pplus=t顶点[iplus];
}
a1stDerivative.x=(pplus.x-pminus.x)/(iplus-iminus);
a1st.y=(pplus.y-pminus.y)/(iplus-iminus);
a2ndDerivative.x=(pplus.x-2*pos.x+pminus.x)/((iplus-iminus)/2*(iplus-iminus)/2);
a2ndDerivative.y=(pplus.y-2*pos.y+pminus.y)/((iplus-iminus)/2*(iplus-iminus)/2);
adivisor=a2nd导数.x*a2nd导数.x+a2nd导数.y*a2nd导数.y;
如果(abs(遮阳板)>10e-8)
{
acurvature=abs(a2ndDerivative.y*a1stDerivative.x-a2ndDerivative.x*a1stDerivative.y)/pow(adivisior,3.0/2.0);
}
其他的
{
acurvature=数值限制::无穷大();
}
曲率[i]=曲率;
}
回归职业;
}
得到曲率后,我定义了一个边界并通过轮廓:

acurvature = getCurvature(aContours_img[0], 50);

if(acurvature.size() > 0)
{
    // aSegmentChange =1 --> curved segment
   // aSegmentChange =0 --> straigth segment
    if( acurvature[0] < aBorder)
    {
        aSegmentChange = 1;
    }
    else
    {
        aSegmentChange = 0;
    }

    // Kontur segmentieren
    for(int i = 0; i < (int)acurvature.size(); i++)
    {
        aSegments[aSegmentIndex].push_back(aContours_img[0][i]);
        aCurveIndex[aSegmentIndex].push_back(aSegmentChange);

        if( acurvature[i] < aBorder && aSegmentChange == 0 )
        {
            aSegmentIndex++;
            aSegmentChange = 1;
        }
        if( acurvature[i] > aBorder && aSegmentChange == 1 )
        {
            aSegmentIndex++;
            aSegmentChange = 0;
        }

        if(aSegmentIndex >= (int)aSegments.size()-1)
        {
            aSegments.resize(aSegmentIndex+1);
            aCurveIndex.resize(aSegmentIndex+1);
        }
    }
}
acurvature=getCurvature(aContours\u img[0],50);
如果(acurvature.size()>0)
{
//ASEMENTCHANGE=1-->曲线段
//ASEMENTCHANGE=0-->第四段
if(敏锐度[0]<中止)
{
A段变化=1;
}
其他的
{
a段变化=0;
}
//康图尔
对于(int i=0;i<(int)acurvature.size();i++)
{
aSegments[aSegmentIndex].向后推(aContours\u img[0][i]);
aCurveIndex[aSegmentIndex]。向后推(aSegmentChange);
if(acurvature[i]aBorder&&aSegmentChange==1)
{
ASEMENTINDEX++;
a段变化=0;
}
如果(aSegmentIndex>=(int)aSegments.size()-1)
{
aSegments.resize(aSegmentIndex+1);
aCurveIndex.resize(aSegmentIndex+1);
}
}
}
这是我的轮廓


这是分割的结果

使用形态学操作来细化曲线。使用曲率来估计局部的“非直”程度。谢谢你的回答。你知道是否有一个opencv函数可以计算曲率吗?请参阅答案中的示例和曲率代码calculation@sjanko你找到解决办法了吗?如果你有,请把它寄出去