grabcut 배경제거 튕김 현상

조회수 1075회

grabcut 알고리즘을 이용하여 사진의 배경을 제거하는 작업 진행 중인데 객체에 네모 박스를 쳐 주고 n키를 누르면 output창에 배경이 제거된 사진이 뜨도록 하였습니다. 그런데 n 키를 누르면 자꾸 이런 오류가 나면서 튕기는데 이유가 뭘까요..? 이미지

정상적인 실행 화면은 이렇습니다. 이미지

주요코드입니다

while True: cv2.imshow('output', output) cv2.imshow('input', img)

        # 키보드 입력을 1밀리세컨드 기다림. 
        k = cv2.waitKey(1) & 0xFF

        # esc 누를 시 다음 사진으로 작업이 넘어감.
        if k == 27:
            cv2.destroyAllWindows()
            break

        # '0'버튼을 누르면 지우고 싶은 배경 부분에 검은색 마킹 가능.
        if k == ord('0'):
            print('왼쪽 마우스로 제거할 부분을 표시한 후 n을 누르세요.')
            value = DRAW_BG  # 검은 마킹 값

        # '1'버튼을 누르면 살리고 싶은 전경 부분에 하얀 마킹 가능.
        if k == ord('1'):
            print('왼쪽 마우스로 제거할 부분을 표시한 후 n을 누르세요.')
            value = DRAW_FG  # 하얀 마킹 값

        # 'r'버튼을 누르면 모든 작업이 리셋됨. (변수들 맨처음으로 초기화) 
        elif k == ord('r'):
            print('리셋합니다.')
            rect = (0, 0, 1, 1)
            drawing = False
            rectangle = False
            rect_or_mask = 100
            rect_over = False
            value = DRAW_FG
            img = img2.copy()
            mask = np.zeros(img.shape[:2], dtype=np.uint8)
            output = np.zeros(img.shape, np.uint8)
            print('0:제거배경선택, 1:복원전경선택, n:적용하기, r:리셋')

        # n키 누를시 그랩컷 알고리즘 실행 후 출력창에 디스플레이함.
        elif k == ord('n'):
            bgdModel = np.zeros((1, 65), np.float64)  # 알고리즘에 의해 내부적으로 사용되는 배열.
            fgdModel = np.zeros((1, 65), np.float64)

            # GC_INIT 인자는 상자와 터치업 스트로크 방식을 결정하는 모드.
            if rect_or_mask == 0:
                cv2.grabCut(img2, mask, rect, bgdModel, fgdModel, 1, cv2.GC_INIT_WITH_RECT)
                rect_or_mask = 1

            elif rect_or_mask == 1:
                cv2.grabCut(img2, mask, rect, bgdModel, fgdModel, 1, cv2.GC_INIT_WITH_MASK)

            print('0:제거배경선택, 1:복원전경선택, n:적용하기, r:리셋')

        mask2 = np.where((mask == 1) + (mask == 3), 255, 0).astype('uint8')

        # cv2.bitwise_and 연산자는 둘다 0이 아닌 경우만 값을 통과 시킴.
        # 즉 mask영역 이외는 모두 제거됨.
        output = cv2.bitwise_and(img2, img2, mask=mask2)
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • opencv 를 사용하는 작업인듯 한데...컴파일 오류면 코드만 보고 원인을 찾을 수도 있습니다. 그런데 런타임중의 오류면 직접해보고 정보를 수집해야 합니다. 여기서 정보라는 것은 변수값의 변화등을 말합니다. 즉 런타임중에 발생하는 오류이기 때문에 디버거로 디버깅을 해봐야 합니다. 정영훈 2018.12.8 19:28

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)