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개를 띄우기
해답은 늘 그렇듯 하루코딩에 올려 두겠습니다.
반응형
'python 시작하기' 카테고리의 다른 글
python YOLO (1) | 2025.01.10 |
---|---|
python OpenCV를 활용하여 얼굴 탐지를 해보자 (0) | 2025.01.10 |
python OPEN CV를 더욱 깔끔하게 전 처리 해보자! (1) | 2025.01.08 |
python OPEN CV를 활용하여 이미지를 저장해보자! (0) | 2025.01.08 |
python seaborn을 이용한 데이터 시각화 (0) | 2024.12.18 |