만들고자 하는 프로젝트
- 여러 장의 카드로 이루어진 이미지에서 카드 각각의 윤곽선을 검출
- 검출된 윤곽선을 바탕으로 사진을 잘라내어 추출 후 출력, 저장
- 서로 다른 윈도우(창)에 뜨도록 작업
- 예시 사진

import cv2
img = cv2.imread('card.png')
target_img = img.copy() # 사본 만듬
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #흑백화
ret, otsu = cv2.threshold(gray, -1,255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) #오츠 알고리즘 이진화
contours, hierarchy = cv2.findContours(otsu, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) #윤곽선 검출
COLOR = (0,200,0)
idx = 1; # crop된 이미지가 서로 다른 창에 뜰 수 있도록 idx를 사용
for cnt in contours:
if cv2.contourArea(cnt) > 25000: # 위 사각형 그리기에서 면적 범위를 지정해준 뒤 그 범위 이상일 때만 작동
x, y, width, height = cv2.boundingRect(cnt) #contours에서 검출된 윤곽선 중 25000의 값을 넘은 선을 감싸는 사각형의 위치와 크기를 얻음
cv2.rectangle(target_img,(x, y),(x + width, y + height), COLOR, 2) # boundingRect에 저장된 사각형들에 초록색 두께 2인 네모를 그려줌
crop = img[y:y+height, x:x+width] #위 작업으로 얻은 사각형의 위치를 원본 이미지에서 잘라옴
dst = cv2.resize(crop,None,fx=1.5,fy=1.5) #크롭된 이미지의 크기가 너무 작아 크기 조정해줌
cv2.imshow(f'crop_{idx}',dst) #원본에서 잘라온 이미지를 출력
#cv2.imwrite(f'crop_{idx}.png',dst) # 저장
idx+=1 # 한 개의 창에 크롭된 이미지를 출력한 후 새로운 창에 출력하기 위해 idx 1증가
cv2.imshow('img',img)
cv2.imshow('target_img',target_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 결과
