2016-01-27 6 views
1

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

+1

OpenCV является DEAD. такой код больше не должен быть написан. используйте C++ api. – berak

+0

@berak Я знаю это, даже если я перехожу в C++, вопрос остается тем же. выше allvthis небольшой код большой проект, уже выполненный в c.:-( –

+0

Можете ли вы быть более конкретными по кругам дефектов: они имеют неравномерную толщину сами по себе (на стороне толще другой), или они толще/тоньше, чем другие круги? – Mahm00d

ответ

0

Я могу думать о двух идеях:

Использование периметр:

  1. Найти enclosing circle вашей формы (кольцо).
  2. Сравните его периметр с внешним периметром формы. Если форма имеет какие-либо отклонения вдоль кромки, ее периметр будет отличаться (определением определенного порога)
  3. То же самое можно сделать между внутренним периметром и охватывающим кругом черного внутри (чтобы найти аномалии вдоль внутреннего боковая сторона).

Использование области:

  1. Найти внутренний и внешний ограждающий круг вашего кольца.
  2. Вычтите две области, чтобы найти оптимальную площадь кольца.
  3. Сравните это с фактической площадью кольца и, если оно отличается от порога, круг, вероятно, является дефектом.

Конечно, первый алгоритм более чувствителен к ударам, которые могут быть хорошо или плохо в зависимости от вашего образа и других условий.

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

+0

Я могу добраться досюда, но я хочу определить, если его перечеркнутый круг –