1

想要检测此图像周围的缺陷我正在尝试检测从下面的代码中收到的圆圈的厚度,但我无法这样做。

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

我在谷歌上找到了这个,但我不知道如何把它放在代码中:

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);

在此之后,我知道我需要找到轮廓,但是我怎样才能得到圆的厚度并穿过圆来得到有缺陷的呢?我不想获得像素数并检测有缺陷的圆圈......

当我运行上面的代码时,我得到了这个图像

4

2 回答 2

0

我可以想到两个想法:

使用周长

  1. 找到你的形状的封闭圆(环)。
  2. 将其周长与形状的外周长进行比较。如果形状沿边缘有任何异常,则其周长会有所不同(按您定义的某个阈值)
  3. 在内周边和黑色内侧的包围圈之间也可以这样做(以发现沿内侧的异常)。

使用区域

  1. 找到戒指的内圈和外圈。
  2. 减去这两个区域以找到环的最佳区域。
  3. 将此与环的实际面积进行比较,如果相差一个阈值,则该环可能是缺陷。

当然,第一种算法对凹凸更敏感,这取决于您的图像和其他条件,这可能是好事还是坏事。

于 2016-01-27T10:06:46.317 回答
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);

在此处输入图像描述

于 2016-01-29T03:26:55.557 回答