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)
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력