OpenCV-偏移处的绘制轮廓

OpenCV-偏移处的绘制轮廓,opencv,drawing,contour,approximate,Opencv,Drawing,Contour,Approximate,我正在使用OpenCV进行图像处理。 我正在寻找一个人体,我想隔离(部分) 目前,我能够找到身体的轮廓,并用多边形近似轮廓。接下来,我想在CVD中使用该轮廓,以真正隔离身体 有人知道我怎么画一个向中心偏移的轮廓吗? 要进行说明,请参见下图 蓝色:轮廓的多边形近似 红色:我想要的多边形,但我找不到。(在上图中,我使用了photoshop…) 以下是我如何查找和绘制当前轮廓的方法: CvContourScanner scanner = cvStartFindContours(mask, pStor

我正在使用OpenCV进行图像处理。 我正在寻找一个人体,我想隔离(部分)

目前,我能够找到身体的轮廓,并用多边形近似轮廓。接下来,我想在CVD中使用该轮廓,以真正隔离身体

有人知道我怎么画一个向中心偏移的轮廓吗? 要进行说明,请参见下图

蓝色:轮廓的多边形近似

红色:我想要的多边形,但我找不到。(在上图中,我使用了photoshop…)

以下是我如何查找和绘制当前轮廓的方法:

CvContourScanner scanner = cvStartFindContours(mask, pStorage, sizeof(CvContour),    CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
CvSeq* c;
CvSeq* polyContour;
int numCont = 0;
int perimScale = 4;
int contour_approx_level = 6;
while((c = cvFindNextContour(scanner)) != NULL)
{
    CvSeq* c_new;

    // Polygonal approximation
    c_new = cvApproxPoly(c, sizeof(CvContour), pStorage, CV_POLY_APPROX_DP, contour_approx_level, 0);

    // Create the new contour
    cvSubstituteContour(scanner, c_new);
    numCont++;
}

polyContour = cvEndFindContours(&scanner);
int i = 0;
for(i=0, c=polyContour; c!=NULL; c = c->h_next, i++)
{
    cvDrawContours(pOutput, c, cvScalar(255,125,0), cvScalar(255,255,0), -1, 2, 8);
}

/* Draw the contour at an offset towards the center here */
// Based upon the answers, I found 2 solutions
编辑:根据以下答案,我找到了两种解决方案:

// 1) Erode - 
// void cvErode( const CvArr* A, CvArr* C, IplConvKernel* B=0, int iterations=1 );
cvErode(pOutput, pOutput, NULL, 3);

// 2) Another option - draw with a black border and thick pencil:
cvDrawContours(pOutput, c, cvScalarAll(0), cvScalarAll(0), 12, 2, 8);

这可能不是最优雅的事情,但肯定会奏效:

  • 在新阵列中绘制原始轮廓
  • 计算其距离变换
  • 阈值:如果要偏移10个像素,请使距离贴图中的像素高于10
  • 找到新图像的轮廓
  • 使用函数
    pointPolygonTest()

    可以直接在轮廓上执行类似的、可能不太严格的操作,只需获取轮廓之前找到的蓝色多边形即可。 对于C API(对不起,我不太熟悉C API)


    偏离航线!太简单了!在我的例子中,如果背景是黑色的,也可以用线的厚度绘制相同的轮廓…谢谢你的回答。还用于将我指向PointPolyContest()方法。我发现@lifesayko的答案更简单。
    // void cvErode( const CvArr* A, CvArr* C, IplConvKernel* B=0, int iterations=1 );
    cvErode(pOutput, pOutput, NULL, 3);