1

この画像の周囲の欠陥を検出したい以下のコードから受け取った円の太さを検出しようとしていますが、検出できません。

私の基本的な考え方は、円の中を移動することです。任意の点で厚さが反対側よりも小さい場合、それは不良円であることを意味します。

これを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);

この後、輪郭を見つける必要があることはわかっていますが、円の厚さを取得し、円を移動して欠陥のある円を取得するにはどうすればよいですか? ピクセル数を取得して欠陥のある円を検出したくない...

上記のコードを実行すると、この画像が表示されます

4

2 に答える 2

0

私は2つのアイデアを考えることができます:

周囲を使用する:

  1. あなたの形(リング)の囲み円を見つけてください。
  2. その周囲を形状の外周と比較します。形状にエッジに沿って異常がある場合、その周囲は異なります (定義した特定のしきい値によって)。
  3. 内周と黒い内側の囲み円の間でも同じことができます(内側に沿って異常を見つけるため)。

使用エリア

  1. リングの内側と外側を囲む円を見つけます。
  2. リングの最適な領域を見つけるために 2 つの領域を減算します。
  3. これをリングの実際の面積と比較し、しきい値が異なる場合、円はおそらく欠陥です。

もちろん、最初のアルゴリズムは、画像やその他の条件に応じて、良いことも悪いこともあるバンプに敏感です。

于 2016-01-27T10:06:46.317 に答える