OpenCV中的cvConvexityDefect()函数给出的轮廓的起点是什么

信息处理 图像处理 计算机视觉 opencv
2022-02-21 14:45:26

我必须在我的轮廓中区分手掌和肘部(为此我使用 cvconvexitydefect)。这是图像:

http://imageshack.us/content_round.php?page=done&l=img194/5232/capture12a.jpg

我正在拍摄左图像的轮廓。

右图中的2个最高点是肩膀(通过其他方法检测到)

左下2比右下2暗(区分左右手)

使用代码defect.start 比defect.end 暗(但是对于左手defect.start 是手掌,而对于右手defect.start 是肘部)

我有两个问题:

  1. 那么cvconvexity 缺陷是如何得到它的defect.start 的呢?
  2. 无论如何如何区分手掌和肘部?

为了清楚起见,我认为我可以通过认为开始可能是轮廓的最上点或最左边的点来从肘部辨认出手掌,但事实并非如此。

这是代码的相关部分:

cvFindContours( HeadLess1, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

for(ptr=contours;ptr!=0;ptr=ptr->h_next){
    tem=cvConvexHull2(ptr,0,1,0);
    tem=cvConvexityDefects(ptr,tem,mem);
    CvConvexityDefect defect,cd;
    defect.depth=0;

    for(int l=0;l<tem->total;l++){
        cd=*(CvConvexityDefect*)cvGetSeqElem(tem,l);
        if(cd.depth>defect.depth)defect=cd;
    }

    if((*(defect.start)).y>(*(defect.end)).y){
        elbow=(*(defect.start));palm=(*(defect.end));
        //a bad inference for the case when palm is above elbow
    } else { 
        elbow=(*(defect.end));palm=(*(defect.start));
        //a bad inference same case
    }

    if(elbow.x<320)
    {
        q=100;
    }
    else
    {
        q=200;
    }

    cvCircle(HeadLess1,*(defect.start),10,cvScalarAll(q),CV_FILLED);
    cvCircle(HeadLess1, *(defect.end), 10, cvScalarAll(q+50), CV_FILLED);

}

Headless1 一个是我的形象。提前致谢。

1个回答

如果您可以获得右手图像中显示的点的坐标,并且您知道与肩膀有关的点,您是否可以假设手掌比肘部离肩膀更远?

如果您认为这是真的,那么您只需要找到从肩膀到肘部和手掌的距离,并将距离较大的点称为手掌。

当然,你可以弯曲你的手臂,让手掌更靠近肘部,所以这可能不是一个理想的方法......