找到从轮廓检测到的圆的厚度?

时间:2016-01-27 05:30:48

标签: c opencv geometry image-recognition opencv-contour

want to detect the defect around this image我正在尝试从下面的代码中检测到我收到的圆圈的粗细,但我无法这样做。

我的基本想法是穿过圆圈,如果厚度小于另一边,则意味着它是一个缺陷的圆圈。

我在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

2 个答案:

答案 0 :(得分:0)

我可以想到两个想法:

使用周边

  1. 找到你形状的enclosing circle(戒指)。
  2. 将其周长与形状的外围进行比较。如果形状沿边缘有任何异常,则其周长将不同(按您定义的某个阈值)
  3. 内圈和黑圈内圈之间也可以这样做(以找到内侧的异常)。
  4. 使用区域

    1. 找到戒指的内外圆圈。
    2. 减去这两个区域以找到环的最佳区域。
    3. 将此值与环的实际面积进行比较,如果阈值不同,圆圈可能会出现缺陷。
    4. 当然,第一种算法对颠簸更敏感,根据你的图像和其他条件,这可能是好事还是坏事。

答案 1 :(得分:0)

作为建议你可以尝试

.
.
.
cvAnd(srcimg,subimg,finalimage,0);

cvSmooth(finalimage,erodeimg,CV_GAUSSIAN,9,9);
cvThreshold(erodeimg,subimg,130,255,cv::THRESH_BINARY);
cvShowImage("final image",finalimage);
cvShowImage("Smoothed and Threshold ",subimg);

cvWaitKey(0);

enter image description here