파이썬으로 영상처리_한 장의 사진에서 여러 윤곽선 검출, 출력, 저장

k_minseokVv·2024년 1월 8일
0

OpenCV - Python

목록 보기
12/13

만들고자 하는 프로젝트

  • 여러 장의 카드로 이루어진 이미지에서 카드 각각의 윤곽선을 검출
  • 검출된 윤곽선을 바탕으로 사진을 잘라내어 추출 후 출력, 저장
  • 서로 다른 윈도우(창)에 뜨도록 작업
  • 예시 사진
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()
  • 결과
profile
C++, Python 활용 중

0개의 댓글