728x90
작성일자 : 21.09.27
외곽선 검출
- 이진화를 통해 얻은 영상으로 부터 레이블 맵을 생성 함
- 이미지의 윤곽을 검출한다는 개념
- 이미지 자체에 검출된 구역을 나눈 후 각각을 contours 로 적용이 됨
- 컨투어의 크기와 사이즈 각도도 검출할 수 있음
import cv2
import numpy as np
img = cv2.imread(IMG_DIR)
img2 = img.copy()
# 그레이 스케일로 변환
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 스레시홀드로 바이너리 이미지로 만들어서 검은배경에 흰색전경으로 반전
ret, imthres = cv2.threshold(imgray, 127, 255, cv2.THRESH_BINARY_INV)
# 가장 바깥쪽 컨투어에 대해 모든 좌표 반환
im2, contour, hierarchy = cv2.findContours(imthres, cv2.RETR_EXTERNAL, \
cv2.CHAIN_APPROX_NONE)
# 가장 바깥쪽 컨투어에 대해 꼭지점 좌표만 반환
im2, contour2, hierarchy = cv2.findContours(imthres, cv2.RETR_EXTERNAL, \
cv2.CHAIN_APPROX_SIMPLE)
# 각각의 컨투의 갯수 출력
print('도형의 갯수: %d(%d)'% (len(contour), len(contour2)))
# 모든 좌표를 갖는 컨투어 그리기, 초록색
cv2.drawContours(img, contour, -1, (0,255,0), 4)
# 꼭지점 좌표만을 갖는 컨투어 그리기, 초록색
cv2.drawContours(img2, contour2, -1, (0,255,0), 4)
# 컨투어 모든 좌표를 작은 파랑색 점(원)으로 표시
for i in contour:
for j in i:
cv2.circle(img, tuple(j[0]), 1, (255,0,0), -1)
# 컨투어 꼭지점 좌표를 작은 파랑색 점(원)으로 표시
for i in contour2:
for j in i:
cv2.circle(img2, tuple(j[0]), 1, (255,0,0), -1)
# 결과 출력
cv2.imshow('CHAIN_APPROX_NONE', img)
cv2.imshow('CHAIN_APPROX_SIMPLE', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
728x90
'Done > C++_Python' 카테고리의 다른 글
[C++] 함수의 전달(값, 참조, 주소) [* , &] (0) | 2023.06.05 |
---|---|
[Python] 지정 경로에 경로 존재 여부 확인, 디렉토리 생성 (0) | 2023.06.01 |
[Ubuntu CMake] OpenCV 원하는 폴더에 build & Install (0) | 2023.06.01 |
[Ubuntu CMake] VSCode CMake build&debug (C++) (0) | 2023.06.01 |
[OpenCV C++] 컬러영상을 그레이스케일 이미지로 변환하는 방법(cvtColor & 연산을 이용한 방법 & sol.) (0) | 2023.06.01 |