c - 查找从轮廓检测到的圆的粗细?-LMLPHP我正在尝试检测从下面的代码接收到的圆的粗细,但是我无法做到这一点。

我的基本想法是在圆中移动,如果在任何一点上的厚度都小于另一侧,则表示它是有缺陷的圆。

我在Google上找到了这个,但我不知道如何将其放入代码中:

http://answers.opencv.org/question/28180/measuring-edge-thickness-using-opencv

码:

    IplImage* mainimg = cvLoadImage( "C:\\3.png",CV_LOAD_IMAGE_GRAYSCALE); //change the name (image.jpg) according to your Image filename.
    if (!mainimg)
  {
    cout <<"Image can NOT Load!!!";
    return 1;
  }

    IplImage* srcimg=cvCreateImage(cvGetSize(mainimg),mainimg->depth,1);
    IplImage* inrangeimg=cvCreateImage(cvGetSize(mainimg),mainimg->depth,1);
    IplImage* erodeimg=cvCreateImage(cvGetSize(mainimg),mainimg->depth,1);
    IplImage* erodeimg1=cvCreateImage(cvGetSize(mainimg),mainimg->depth,1);
IplImage* subimg=cvCreateImage(cvGetSize(mainimg),mainimg->depth,1);
IplImage* finalimage=cvCreateImage(cvGetSize(mainimg),mainimg->depth,1);
IplImage* finalimage1=cvCreateImage(cvGetSize(mainimg),mainimg->depth,1);


    cvAdaptiveThreshold(mainimg,srcimg,255,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,11,-23);

    cvInRangeS(mainimg,cvScalar(50,50,50),cvScalar(255,255,255),inrangeimg);

    cvErode(inrangeimg,erodeimg,0,8);
    cvSub(inrangeimg,erodeimg,subimg,0);

    cvAnd(srcimg,subimg,finalimage,0);

    cvShowImage("final",finalimage);
    cvWaitKey(0);

此后,我知道我需要找到轮廓,但是如何获得圆的厚度并穿过圆以得到有缺陷的圆呢?我不想获取像素数并检测缺陷圆...

当我运行上面的代码时,我得到了image

最佳答案

我可以想到两个想法:

使用周界:

  • 找到您的形状(戒指)的enclosing circle
  • 将其周长与形状的外周长进行比较。如果形状沿边缘有任何异常,则其周长将有所不同(按您定义的某个阈值)
  • 可以在内部边界和黑色内部的包围圆之间进行相同的操作(以发现内部的异常)。


  • 使用区域:
  • 查找戒指的内圈和外圈。
  • 将两个面积相减以找到环的最佳面积。
  • 将此与环的实际面积进行比较,如果相差一个阈值,则该圆可能是缺陷。


  • 当然,第一种算法对凹凸更敏感,根据您的图像和其他条件,凹凸可能是好事,也可能是坏事。

    09-10 06:48
    查看更多