emgu cv로 불필요한 줄을 제거하는 방법

떨어지는

Emgu CV로 타원 같은 물방울의 윤곽을 감지하려고합니다. 윤곽선 감지를위한 코드를 작성했습니다.

    public List<int> GetDiameters()
    {
        string inputFile = @"path.jpg";

        Image<Bgr, byte> imageInput = new Image<Bgr, byte>(inputFile);

        Image<Gray, byte> grayImage = imageInput.Convert<Gray, byte>();

        Image<Gray, byte> bluredImage = grayImage;
        CvInvoke.MedianBlur(grayImage, bluredImage, 9);

        Image<Gray, byte> edgedImage = bluredImage;
        CvInvoke.Canny(bluredImage, edgedImage, 50, 5);

        Image<Gray, byte> closedImage = edgedImage;           
        Mat kernel = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Ellipse, new System.Drawing.Size { Height = 100, Width = 250}, new System.Drawing.Point(-1, -1)); 
        CvInvoke.MorphologyEx(edgedImage, closedImage, Emgu.CV.CvEnum.MorphOp.Close, kernel, new System.Drawing.Point(-1, -1), 0, Emgu.CV.CvEnum.BorderType.Replicate, new MCvScalar());
       System.Drawing.Point(100, 250), 10000, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar()

        Image<Gray, byte> contoursImage = closedImage;
        Image<Bgr, byte> imageOut = imageInput;
        VectorOfVectorOfPoint rescontours1 = new VectorOfVectorOfPoint();
        using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
        {
            CvInvoke.FindContours(contoursImage, contours, null, Emgu.CV.CvEnum.RetrType.List,
                Emgu.CV.CvEnum.ChainApproxMethod.LinkRuns);
            MCvScalar color = new MCvScalar(0, 0, 255);

            int count = contours.Size;
            for (int i = 0; i < count; i++)
            {
                using (VectorOfPoint contour = contours[i])
                    using (VectorOfPoint approxContour = new VectorOfPoint())
                    {
                        CvInvoke.ApproxPolyDP(contour, approxContour,
                            0.01 * CvInvoke.ArcLength(contour, true), true);

                        var area = CvInvoke.ContourArea(contour);

                    if (area > 0 && approxContour.Size > 10)
                    {
                        rescontours1.Push(approxContour);
                    }

                        CvInvoke.DrawContours(imageOut, rescontours1, -1, color, 2);
                    }                   
            }
        }          
    }

지금까지의 결과 :

여기에 이미지 설명 입력

근사에 문제가 있다고 생각합니다. 내부 선을 제거하고 외부 윤곽을 닫는 방법은 무엇입니까?

Aaron Jones

문제를 정확히 파악하기 위해 추가 정보가 필요할 수 있지만 중앙값 흐림과 관련이있을 수 있습니다. EmguCV가 흐려짐이 충분히 흐려져 가장자리 감지를 능숙하게 할 수 있는지 확인합니다. 사용할 수있는 또 다른 방법은 Dilate입니다. Canny 에지 감지에 전화를 걸어 더 나은 결과를 얻을 수 있는지 확인하십시오.

편집하다

다음은 아래 코드입니다.

    public List<int> GetDiameters()
    {
        //List to hold output diameters
        List<int> diametors = new List<int>();

        //File path to where the image is located
        string inputFile = @"C:\Users\jones\Desktop\Image Folder\water.JPG";

        //Read in the image and store it as a mat object
        Mat img = CvInvoke.Imread(inputFile, Emgu.CV.CvEnum.ImreadModes.AnyColor);

        //Mat object that will hold the output of the gaussian blur
        Mat gaussianBlur = new Mat();

        //Blur the image
        CvInvoke.GaussianBlur(img, gaussianBlur, new System.Drawing.Size(21, 21), 20, 20, Emgu.CV.CvEnum.BorderType.Default);

        //Mat object that will hold the output of the canny
        Mat canny = new Mat();

        //Canny the image
        CvInvoke.Canny(gaussianBlur, canny, 40, 40);

        //Mat object that will hold the output of the dilate
        Mat dilate = new Mat();

        //Dilate the canny image
        CvInvoke.Dilate(canny, dilate, null, new System.Drawing.Point(-1, -1), 6, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar(0, 0, 0));

        //Vector that will hold all found contours
        VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();

        //Find the contours and draw them on the image
        CvInvoke.FindContours(dilate, contours, null, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
        CvInvoke.DrawContours(img, contours, -1, new MCvScalar(255, 0, 0), 5, Emgu.CV.CvEnum.LineType.FourConnected);

        //Variables to hold relevent info on what is the biggest contour
        int biggest = 0;
        int index = 0;

        //Find the biggest contour
        for (int i = 0; i < contours.Size; i++)
        {
            if (contours.Size > biggest)
            {
                biggest = contours.Size;
                index = i;
            }
        }

        //Once all contours have been looped over, add the biggest contour's index to the list
        diametors.Add(index);

        //Return the list
        return diametors;
    }

가장 먼저 할 일은 이미지를 흐리게하는 것입니다. 여기에 이미지 설명 입력

그런 다음 이미지를 멋지게 만듭니다. 여기에 이미지 설명 입력

그런 다음 최종 출력 윤곽을보다 균일하게 만들기 위해 이미지를 확장합니다. 여기에 이미지 설명 입력

그런 다음 윤곽을 찾습니다. 여기에 이미지 설명 입력

최종 윤곽이 물방울보다 조금 더 크다는 것을 알고 있지만 이것이 제가 생각 해낼 수있는 최선의 방법입니다. 결과를 좀 더 깔끔하게 만들기 위해 일부 설정과 위의 코드를 조작 할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

페이지에서 불필요한 ng-container 여백을 제거하는 방법은 무엇입니까?

분류에서Dev

nd 배열에서 불필요한 배열을 모두 제거하는 방법

분류에서Dev

emgu-cv c #에서 마스크를 GrabCut 메서드로 설정하는 방법은 무엇입니까?

분류에서Dev

CSS에서 버튼 사이의 불필요한 공간을 제거하는 방법

분류에서Dev

grep에서 줄 제한을 제거하는 방법

분류에서Dev

JQ를 사용하여 JSON에서 불필요한 항목을 제거하는 방법은 무엇입니까?

분류에서Dev

Drawing.Bitmap을 Emgu.CV.Image로 변환하는 SystemAccessViolation

분류에서Dev

불필요한 새 줄을 만드는 Java로 XML 작성

분류에서Dev

pandas로 Dataframe에서 필요한 열을 삭제하는 방법

분류에서Dev

'Emgu.CV.Mat'유형을 'Emgu.CV.Image <Emgu.CV.Structure.Bgr, byte>'로 변환

분류에서Dev

WITH ROLLUP으로 가져 오는 불필요한 값을 제거하고 대신 TOTAL을 추가하는 방법은 무엇입니까?

분류에서Dev

Windows 7에서 불필요한 기능과 추가 기능을 제거하는 방법은 무엇입니까?

분류에서Dev

정수 n을 기반으로 줄을 제거하는 방법?

분류에서Dev

불필요한 극한값을 추가하지 않는 보간 방법

분류에서Dev

과도한 불필요한 메모리 사용으로부터 grep을 방지하는 방법

분류에서Dev

불필요한 기록을 제거하는 방법

분류에서Dev

추가 후 불필요한 HTML을 제거하는 방법은 무엇입니까?

분류에서Dev

장고 형태로 불필요한 필드를 설정하는 방법

분류에서Dev

두 줄 사이의 한 줄을 제거하는 방법

분류에서Dev

Linux에서 불필요한 파일을 정리하는 방법

분류에서Dev

내용이 한 줄 임에도 불구하고 제목을 두 줄로 고정하는 방법

분류에서Dev

QLabel이 불필요한 단어 줄 바꿈을 방지하는 방법은 무엇입니까?

분류에서Dev

불필요한 파일을 정리하는 방법

분류에서Dev

emgu cv에서 투명성을 만드는 방법은 무엇입니까?

분류에서Dev

git push 전에 이미 커밋 된 불필요한 파일을 제거하는 방법

분류에서Dev

XPath, 유로 기호 불필요한 문자를 삭제하는 방법?

분류에서Dev

Emgu CV 3.1을 사용한 올바른 메모리 관리 방법

분류에서Dev

활성 탐색 링크에서 마우스 오버시 불필요한 추가 밑줄을 제거하는 방법은 무엇입니까?

분류에서Dev

여러 MOK 키를 통합하거나 불필요한 것을 삭제하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    페이지에서 불필요한 ng-container 여백을 제거하는 방법은 무엇입니까?

  2. 2

    nd 배열에서 불필요한 배열을 모두 제거하는 방법

  3. 3

    emgu-cv c #에서 마스크를 GrabCut 메서드로 설정하는 방법은 무엇입니까?

  4. 4

    CSS에서 버튼 사이의 불필요한 공간을 제거하는 방법

  5. 5

    grep에서 줄 제한을 제거하는 방법

  6. 6

    JQ를 사용하여 JSON에서 불필요한 항목을 제거하는 방법은 무엇입니까?

  7. 7

    Drawing.Bitmap을 Emgu.CV.Image로 변환하는 SystemAccessViolation

  8. 8

    불필요한 새 줄을 만드는 Java로 XML 작성

  9. 9

    pandas로 Dataframe에서 필요한 열을 삭제하는 방법

  10. 10

    'Emgu.CV.Mat'유형을 'Emgu.CV.Image <Emgu.CV.Structure.Bgr, byte>'로 변환

  11. 11

    WITH ROLLUP으로 가져 오는 불필요한 값을 제거하고 대신 TOTAL을 추가하는 방법은 무엇입니까?

  12. 12

    Windows 7에서 불필요한 기능과 추가 기능을 제거하는 방법은 무엇입니까?

  13. 13

    정수 n을 기반으로 줄을 제거하는 방법?

  14. 14

    불필요한 극한값을 추가하지 않는 보간 방법

  15. 15

    과도한 불필요한 메모리 사용으로부터 grep을 방지하는 방법

  16. 16

    불필요한 기록을 제거하는 방법

  17. 17

    추가 후 불필요한 HTML을 제거하는 방법은 무엇입니까?

  18. 18

    장고 형태로 불필요한 필드를 설정하는 방법

  19. 19

    두 줄 사이의 한 줄을 제거하는 방법

  20. 20

    Linux에서 불필요한 파일을 정리하는 방법

  21. 21

    내용이 한 줄 임에도 불구하고 제목을 두 줄로 고정하는 방법

  22. 22

    QLabel이 불필요한 단어 줄 바꿈을 방지하는 방법은 무엇입니까?

  23. 23

    불필요한 파일을 정리하는 방법

  24. 24

    emgu cv에서 투명성을 만드는 방법은 무엇입니까?

  25. 25

    git push 전에 이미 커밋 된 불필요한 파일을 제거하는 방법

  26. 26

    XPath, 유로 기호 불필요한 문자를 삭제하는 방법?

  27. 27

    Emgu CV 3.1을 사용한 올바른 메모리 관리 방법

  28. 28

    활성 탐색 링크에서 마우스 오버시 불필요한 추가 밑줄을 제거하는 방법은 무엇입니까?

  29. 29

    여러 MOK 키를 통합하거나 불필요한 것을 삭제하는 방법은 무엇입니까?

뜨겁다태그

보관