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

Salo7ty

emgu cv에서 GrabCut 메서드를 사용하려고합니다.

이것은 내 코드입니다

 Matrix<double> bg = new Matrix<double>(1, 65);

        bg.SetZero();



        Matrix<double> fg = new Matrix<double>(1, 65);
        fg.SetZero();


        Image<Gray, byte> mask =  new Image<Gray, byte>(img.Size);


        Rectangle rect = new Rectangle(img.Cols / 4, 0, (int)((double)img.Width / (0.75)), img.Height );


        CvInvoke.GrabCut(img, mask, rect,
           bg, fg, 5, Emgu.CV.CvEnum.GrabcutInitType.InitWithRect);


        for (int x = 0; x < mask.Cols; x++)
        {
            for (int y = 0; y < mask.Rows; y++)
            {
                if (mask[y, x].Intensity == new Gray(1).Intensity || mask[y, x].Intensity == new Gray(3).Intensity)
                {
                    mask[y, x] = new Gray(1);
                }
                else
                {
                    mask[y, x] = new Gray(0);
                }
            }

        }

        img = img.Mul(mask.Convert<Bgr,byte>());




        imageBox3.Image = img;

내 이미지 :

여기에 이미지 설명 입력

결과 :

여기에 이미지 설명 입력

근데 티셔츠를 원해서이 마스크를 써보려고 했어요 (포토샵에서 만들었어요)

마스크 :

여기에 이미지 설명 입력

그리고 마스크를 변경하여 코드가 다음과 같이되었습니다.

 Matrix<double> bg = new Matrix<double>(1, 65);

        bg.SetZero();



        Matrix<double> fg = new Matrix<double>(1, 65);
        fg.SetZero();


        Image<Gray, byte> mask =  new Image<Gray, byte>(@"C:\Users\iP\Desktop\exaples\mas.jpg");

        //here i set the only white pixels (foreground object ) to 1 and 0 for else
        for (int x = 0; x < mask.Cols; x++)
        {
            for (int y = 0; y < mask.Rows; y++)
            {
                if (mask[y, x].Intensity > new Gray(200).Intensity)
                {
                    mask[y, x] = new Gray(1);
                }
                else
                {
                    mask[y, x] = new Gray(0);
                }
            }
        }


        Rectangle rect = new Rectangle(img.Cols / 4, 0, (int)((double)img.Width / (0.75)), img.Height );


        CvInvoke.GrabCut(img, mask, rect,
           bg, fg, 5, Emgu.CV.CvEnum.GrabcutInitType.InitWithRect);


        for (int x = 0; x < mask.Cols; x++)
        {
            for (int y = 0; y < mask.Rows; y++)
            {
                if (mask[y, x].Intensity == new Gray(1).Intensity || mask[y, x].Intensity == new Gray(3).Intensity)
                {
                    mask[y, x] = new Gray(1);
                }
                else
                {
                    mask[y, x] = new Gray(0);
                }
            }

        }

        img = img.Mul(mask.Convert<Bgr,byte>());




        CvInvoke.Imshow("result", img);

하지만 첫 번째 마스크로 같은 결과를 얻습니다 (티셔츠없이)

내 코드의 실수는 어디에 있습니까?

Emgu.CV.CvEnum.GrabcutInitType.InitWithRect를
Emgu.CV.CvEnum.GrabcutInitType.InitWithMask 로 변경하려고했습니다.

그리고 나는 이것을 얻는다

여기에 이미지 설명 입력

Salo7ty

이 코드는 지금 작동합니다. :)

Matrix<double> bg = new Matrix<double>(1, 65);

        bg.SetZero();



        Matrix<double> fg = new Matrix<double>(1, 65);
        fg.SetZero();


        Image<Gray, byte> mask = new Image<Gray, byte>(img.Size);


        Rectangle rect = new Rectangle(img.Cols / 4, 0, (int)((double)img.Width / (0.75)), img.Height );


        CvInvoke.GrabCut(img, mask, rect,
           bg, fg, 5, Emgu.CV.CvEnum.GrabcutInitType.InitWithRect);


        Image<Gray, byte> mask2 = new Image<Gray, byte>(@"C:\Users\iP\Desktop\exaples\mas.jpg");

        ////here i set the only white pixels (foreground object ) to 1 and 0 for else
        for (int x = 0; x < mask.Cols; x++)
        {
            for (int y = 0; y < mask.Rows; y++)
            {
                if (mask2[y, x].Intensity > new Gray(200).Intensity)
                {
                    mask[y, x] = new Gray(1);
                }
                else
                {

                }
            }
        }

        CvInvoke.GrabCut(img, mask, rect,
             bg, fg, 5, Emgu.CV.CvEnum.GrabcutInitType.InitWithMask);


        for (int x = 0; x < mask.Cols; x++)
        {
            for (int y = 0; y < mask.Rows; y++)
            {
                if (mask[y, x].Intensity == new Gray(1).Intensity || mask[y, x].Intensity == new Gray(3).Intensity)
                {
                    mask[y, x] = new Gray(1);
                }
                else
                {
                    mask[y, x] = new Gray(0);
                }
            }

        }

        img = img.Mul(mask.Convert<Bgr,byte>());




        CvInvoke.Imshow("result", img);

결과 :

여기에 이미지 설명 입력

동영상 : https://www.youtube.com/watch?v=463TMas4vHU

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++에서 정적 메서드를 비동기 적으로 호출하는 방법은 무엇입니까?

분류에서Dev

c # 메서드에서 메인으로 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

C에서 빈 main () 메서드로 함수를 실행하는 방법은 무엇입니까?

분류에서Dev

cmd / c에서 % ERRORLEVEL %를 설정하는 방법은 무엇입니까?

분류에서Dev

C #에서 특정 처리량으로 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

C ++의 상속 된 클래스에서 일반 메서드를 정적 메서드로 변경하는 방법은 무엇입니까?

분류에서Dev

QuickFixN : QuoteRequest 메시지에서 특정 순서로 필드를 설정하는 방법은 무엇입니까?

분류에서Dev

두 개의 cv :: Point2f에서 cv :: RotatedRect를 만드는 방법은 무엇입니까?

분류에서Dev

Qt에서 한 번에 QLineEdit에 입력 마스크와 QValidator를 설정하는 방법은 무엇입니까?

분류에서Dev

C #에서 크로스 스레드 예외를 수정하는 방법은 무엇입니까?

분류에서Dev

Grabcut 알고리즘에서 원하지 않는 공백을 제거하는 방법은 무엇입니까?

분류에서Dev

C # 메서드를 CLI / C ++ 함수에 콜백으로 전달하는 방법은 무엇입니까?

분류에서Dev

C # 메서드를 CLI / C ++ 함수에 콜백으로 전달하는 방법은 무엇입니까?

분류에서Dev

Scintilla에서 여백 마스크를 설정하는 방법은 무엇입니까?

분류에서Dev

Scintilla에서 여백 마스크를 설정하는 방법은 무엇입니까?

분류에서Dev

systemd-networkd로 네트워크 서브넷 마스크를 설정하는 방법은 무엇입니까?

분류에서Dev

Windows에서 PHPTAL :: setPhpCodeDestination 메소드로 경로를 설정하는 방법은 무엇입니까?

분류에서Dev

한 스레드에서 다른 스레드로 메시지 (C)를 보내는 방법은 무엇입니까?

분류에서Dev

Objective-C Noob : 메인에서 메서드를 정의하고 호출하는 방법은 무엇입니까?

분류에서Dev

C #에서 올바른 BackGroundImage를 설정하는 방법은 무엇입니까?

분류에서Dev

emgu 3.0.0.0에서 모양이 수정 된 후 픽셀 좌표를 얻는 방법은 무엇입니까?

분류에서Dev

div 내에서 SVG를 마스크하는 방법은 무엇입니까?

분류에서Dev

Linq를 사용하여 C #의 List에서 Name 값을 ID로 설정하는 방법은 무엇입니까?

분류에서Dev

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

분류에서Dev

Objective-C에서 메서드를 재정 의하여 하위 클래스를 임시로 정의하는 방법은 무엇입니까?

분류에서Dev

C #에서 제네릭 메서드 오버로드를 만드는 방법은 무엇입니까?

분류에서Dev

실제로 C #에서 비동기 메서드를 작성 / 종료하는 방법은 무엇입니까?

분류에서Dev

C ++에서 QML 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

slurm에서 cv2를 가져 오는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    C ++에서 정적 메서드를 비동기 적으로 호출하는 방법은 무엇입니까?

  2. 2

    c # 메서드에서 메인으로 변수를 전달하는 방법은 무엇입니까?

  3. 3

    C에서 빈 main () 메서드로 함수를 실행하는 방법은 무엇입니까?

  4. 4

    cmd / c에서 % ERRORLEVEL %를 설정하는 방법은 무엇입니까?

  5. 5

    C #에서 특정 처리량으로 메서드를 호출하는 방법은 무엇입니까?

  6. 6

    C ++의 상속 된 클래스에서 일반 메서드를 정적 메서드로 변경하는 방법은 무엇입니까?

  7. 7

    QuickFixN : QuoteRequest 메시지에서 특정 순서로 필드를 설정하는 방법은 무엇입니까?

  8. 8

    두 개의 cv :: Point2f에서 cv :: RotatedRect를 만드는 방법은 무엇입니까?

  9. 9

    Qt에서 한 번에 QLineEdit에 입력 마스크와 QValidator를 설정하는 방법은 무엇입니까?

  10. 10

    C #에서 크로스 스레드 예외를 수정하는 방법은 무엇입니까?

  11. 11

    Grabcut 알고리즘에서 원하지 않는 공백을 제거하는 방법은 무엇입니까?

  12. 12

    C # 메서드를 CLI / C ++ 함수에 콜백으로 전달하는 방법은 무엇입니까?

  13. 13

    C # 메서드를 CLI / C ++ 함수에 콜백으로 전달하는 방법은 무엇입니까?

  14. 14

    Scintilla에서 여백 마스크를 설정하는 방법은 무엇입니까?

  15. 15

    Scintilla에서 여백 마스크를 설정하는 방법은 무엇입니까?

  16. 16

    systemd-networkd로 네트워크 서브넷 마스크를 설정하는 방법은 무엇입니까?

  17. 17

    Windows에서 PHPTAL :: setPhpCodeDestination 메소드로 경로를 설정하는 방법은 무엇입니까?

  18. 18

    한 스레드에서 다른 스레드로 메시지 (C)를 보내는 방법은 무엇입니까?

  19. 19

    Objective-C Noob : 메인에서 메서드를 정의하고 호출하는 방법은 무엇입니까?

  20. 20

    C #에서 올바른 BackGroundImage를 설정하는 방법은 무엇입니까?

  21. 21

    emgu 3.0.0.0에서 모양이 수정 된 후 픽셀 좌표를 얻는 방법은 무엇입니까?

  22. 22

    div 내에서 SVG를 마스크하는 방법은 무엇입니까?

  23. 23

    Linq를 사용하여 C #의 List에서 Name 값을 ID로 설정하는 방법은 무엇입니까?

  24. 24

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

  25. 25

    Objective-C에서 메서드를 재정 의하여 하위 클래스를 임시로 정의하는 방법은 무엇입니까?

  26. 26

    C #에서 제네릭 메서드 오버로드를 만드는 방법은 무엇입니까?

  27. 27

    실제로 C #에서 비동기 메서드를 작성 / 종료하는 방법은 무엇입니까?

  28. 28

    C ++에서 QML 메서드를 호출하는 방법은 무엇입니까?

  29. 29

    slurm에서 cv2를 가져 오는 방법은 무엇입니까?

뜨겁다태그

보관