본문 바로가기

python 시작하기

python OpenCV 컨투어 탐지

728x90
반응형

이번 포스팅에서는 컨투어 탐지와 영상연결 방법에 대해서 학습해 봅시다.

 

컨투어 탐지 및 활용

  • 컨투어는 같은 값의 픽셀로 이루어진 경계선으로, 물체의 윤곽선을 나타냄
  • 실무에서 객체 탐지, 추적, 이미지 분석 등 다양한 응용 사례에 필수
  • 물체의 모양 및 크기 분석
    • 컨투어를 통해 물체의 면적(cv2.contourArea), 중심 좌표, 둘레 길이(cv2.arcLength), 모양(타원, 사각형 등)을 계산할 수 있음
  • 물체 탐지
    • 컨투어를 추출하여 특정 조건(면적, 모양)에 부합하는 물체를 탐지 또는 물체를 추적하거나 인식
  • 이미지 분활 및 전처리
    • 컨투어를 사용하여 관심 영역(ROI)을 분리하거나 배경과 물체를 분리함
  • findContours(이미지, 컨투어 검색 모드, 컨투어 근사화 방법)
  • 컨투어 탐색 모드
    • cv2.RETR_EXTERNAL: 외부 윤곽선만 탐지
    • cv2.RETR_TREE : 모든 컨투어를 계측적 구조로 탐지
  • 컨투어 근사화 방법:
    • cv2.CHAIN_APPROX_SIMPLE : 컨투어를 압축하여 직선만 저장
    • cv2.CHAIN_APPROX_NONE : 모든 컨투어 포인트를 저장
  • 컨투어 윤곽선 그리기
  • drawContours(컨투어를 그릴 이미지, 컨투어 정보 리스트, 그릴 컨투어의 인덱스, 컨투어의 색상 (BGR 튜플), 선의 두께)
  • 그릴 컨투어의 인덱스
    • -1 : 모든 컨투어를 그림
    • 정수 : 특정 인덱스의 컨투어만 그림
  • 선의 두께
    • -1 : 컨투어 내부를 채움

그런데 보통 이런 컨투어를 사용하기 위해서는 컴퓨터가 이미지나 영상을 읽을 수 있어야 할 것 같지 않나요?

네 이럴 때 보통 이진화 방법을 사용합니다.

(OpenCV는 개인적인 이미지나 영상을 주로 사용하기에 중간 중간에 실습을 넣기에는 힘든점 양해 부탁드려요 ㅠㅠ)

 

이진화

  • trreshold()는 이미지를 이진화하여 픽셀 값을 두 개의 범위로 나눔
  • retval, binary_img = cv2.threshold(src, thresh, maxval, type)
    • src : 입력 이미지 (Grayscale)
    • thresh : 임계값(Threshold), 픽셀 값이 이 값을 기준으로 구분
    • maxval : 임계값을 넘는 경우 대체될 최대 값 (흰색 값, 보통 255)
    • type : 이진화 방식
      • cv2. THRESH_BINARY : 픽셀 값이 임계값보다 크면 maxval, 작으면 0
      • cv2. THRESH_BINARY_INV : THRESH_BINARY와 반대, 임계값보다 크면 0, 작으면 maxval
      • cv2. THRESH_TRUNC: 픽셀 값이 임계값보다 크면 임계값으로 설정, 작으면 그대로 유지
      • cv2. THRESH_TOZERO : 픽셀 값이 임계값보다 작으면 0, 크면 그대로 유지
      • cv2. THRESH_TOZERO_INV : THRESH_TOZERO와 반대, 임계값보다 크면 0, 작으면 그대로 유지

이제 이진화 까지 진행 했으니 이미지를 하나 준비해주세요.(도형위주인 이미지가 좋습니다.)

실습1. 이미지 컨투어

  • 이미지를 그레이 스케일 진행
  • 이진화 진행
  • 컨투어 진행
  • 출력

 

아까 저희가 컨투어 명령어중 면적, 둘레길이, 중심점을 계산할수 있다고 했으니 그것도 실습을 해봅시다!

 

실습2. 이미지 컨투어 특징 계산

  • 영역 면적 계산
  • 중심점을 계산
  • 길이를 계산

뭔가 내용은 많지만 막상 코드를 짜보면 짧은 코드로 재밌는 결과물을 낼 수있지 않나요 :)

 

이제 그럼 이번 포스팅의 꽃 영상 연결을 해봅시다.

웹캠이 없으신 분들은 동영상 하나를 준비하셔서 약간 코드를 바꿔 주시면 됩니다.

 

비디오 연결

  • 비디오 파일 읽기 및 웹캠 스트리밍
  • VideoCapture(source)
  • source : 비디오 경로 또는 0(웹캠)

 

위와 같은 코드를 실행하면 이제 웹캠이 있는 분들은 웹캠이 연결 될것입니다.

웹캠이 안되시는 분들은 video를 불러오는 방식으로 해주시길 바랍니다.

  • VideoWrite(filename, fourcc, fps, frameSize)
    • filename : 저장할 파일 이름
    • fourcc : 코덱 (cv2.VideoWriter_fourcc(*'XVID')
    • fps : 초당 프레임 수
    • frameSize : 프레임 크기 (너비, 높이 튜플)

오늘도 같이 공부하시느라 수고 많으셨습니다!!!!!!

이제는 과제가 있어야 겠죠ㅎㅎ

과제. 손 윤곽선을 감지하고 필터를 추가

  • 웹캠에서 실시간 영상 읽기
  • 손 윤곽선 감지
    • 그레이스켈일 변환 : cv2.cvtColor를 사용
    • 임계값 처리 : cv2.threshold로 이진화
    • 컨투어 탐지 : cv2.findContours를 사용하여 손 윤곽선을 감지
    • 컨투어 그리기 : cv2.drawContours를 활용
  • 필터추가
    • 샤프닝 필터를 적용하여 윤곽선을 강조
  • 원본, 윤곽선(컨투어) 감지, 샤프닝 필터 영상 3개를 띄우기

해답은 늘 그렇듯 하루코딩에 올려 두겠습니다. 

반응형