본문 바로가기
공부/Computer Vision

[Computer Vision] 파이썬 OpenCV 기본 사용법

by 웅대 2023. 8. 17.
728x90
반응형

컴퓨터 비전(Computer Vision)이란 인간의 시각이 할 수 있는 일들을 수행하는 자율적인 시스템을 만드는 것을 목표로 하는 컴퓨터 과학의 연구 분야이다.

 

카메라와 동영상에서 디지털 이미지와 딥 러닝 모델을 사용하여 객체를 식별할 수 있다.

 

OpenCV는 실시간 컴퓨터 비전을 목적으로 한 프로그래밍 라이브러리이다.

 

이번 포스팅에서는 OpenCV의 간단한 사용 방법에 대해 알아보려고 한다.

 

통합 개발 환경(IDE)는 PyCharm을 사용할 예정이다.

 

기본적으로 cv2를 사용하며 import cv2를 통해 cv2를 import 하면 된다.

 

이미지 불러와서 출력

cv2.imread('이미지 경로')

Resources 디렉토리를 생성하고 그 안에 woman.jpg 이미지 파일을 넣고 이를 불러오려면 아래 코드를 작성한다.

 

img = cv2.imread('Resources/woman.jpg')

 

cv2.imshow('창 이름', img)

imread를 통해 이미지를 읽어온 다음 cv2.imshow 메소드를 사용해서 창을 띄워서 그 안에 이미지를 출력할 수 있다.

 

cv2.imshow("image",img)
CV2.waitKey(0)

이미지 출력 결과

참고로 cv2.waitKey()는 인자만큼(ms) 기다린다는 뜻인데 0을 입력하면 무한을 의미한다.

 

waitKey를 사용하지 않으면 이미지가 출력되자마자 바로 창이 종료되기 때문에 이미지를 보기 어렵다.

 

그래서 이미지를 출력하고 무한 대기를 걸어두는 것이다.

이미지 가공

cv2.resize(이미지, (width, height))

위의 cv2.imread를 통해 이미지를 가져왔다면 이를 원하는 사이즈로 바꿀 수 있다.

 

만약 width를 300, height를 200으로 하고 싶다면 아래와 같이 코드를 작성한다.

 

imgResize = cv2.resize(img, (300, 200))

 

img[0:200, 200:500]

이미지는 기본적으로 행렬이기 때문에 인덱스를 통해서 원하는 만큼 자를 수가 있다.

 

이미지를 자르기에 앞서 이미지의 width와 height는 아래 그림과 같이 좌측 상단이 (0, 0)이다.

 

즉 img[0:200, 200:500]의 의미는 아래와 빨간색 사각형 부분만 가져오는 것과 같다.

 

cv2.cvtColor(이미지, 옵션)

cv2.cvtColor 메소드는 하나의 color space에서 다른 color space로 변경하는 메소드이다.

 

간단하게 원본 이미지를 회색으로 변경해보자.

 

옵션에는 cv2.COLOR_BGR2GRAY를 넣어주면 된다.

 

BGR에서 GRAY로 변경한다는 뜻이다. (cv에서는 기본적으로 RGB가 아니라 BGR이다.)

# 이미지를 회색으로
img = cv2.imread('Resources/woman.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", img_gray)

gray scale

 

cv2.GaussianBlur(이미지, 커널 사이즈, 시그마)

이미지를 Gaussian 방식으로 블러 처리하는 메소드이다.

 

노이즈를 제거하고 이미지를 부드럽게 할 때 사용된다.

 

물론 GaussianBlur 말고도 블러하는 방식은 다양하다.

 

우선 위에서 회색으로 바꾼 imgGray를 블러처리 해볼 예정이다.

 

imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
cv2.imshow("blur", imgBlur)

blur

 

cv2.Canny(이미지, 하단 임계값, 상단 임계값)

cv2.Canny는 윤곽선을 검출할 때 사용한다.

 

gray 처리한 imgGray를 통해 윤곽선을 검출해보자.

imgCanny = cv2.Canny(imgGray, 100, 100)
cv2.imshow("canny", imgCanny)

canny

 

cv2.dilate(이미지, 커널, iterations)

윤곽선을 검출해냈는데 잘 보이지 않는다면 dilate를 통해 두껍게 만들 수 있다.

 

우선 그 전에 커널을 생성하자. 커널은 numpy를 통해 생성한다. import numpy as np를 통해 가져오자.

 

# 커널 생성
import numpy as np
kernel = np.ones((5, 5), np.uint8)
# dilation 적용
imgDilation = cv2.dilate(imgCanny, kernel, iterations=1)
cv2.imshow("dilate", imgDilation)

dilation

 

cv2.erode(이미지, 커널, iterations)

역시 커널을 생성하고 사용하면 된다. dilate와 반대로 굵기를 얇게 한다.

 

도형 및 텍스트 추가

이미지 위에 도형을 그리고 텍스트를 작성하는 방법에 대해서 알아보자.

 

cv2.line(이미지, 시작 좌표, 끝 좌표, 색, 굵기)

직선을 그린다.

img = np.zeros((300, 300, 3))
cv2.line(img, (0, 0), (100, 150), (0, 255, 0), 10)
cv2.imshow("line", img)

 

line

 

cv2.rectangle(이미지, 시작 좌표, 끝 좌표, 색, 굵기)

사각형을 그린다.

img = np.zeros((300, 300, 3))
cv2.rectangle(img, (100, 100),(300, 300), (255, 0, 0),10)
cv2.imshow("image", img)

rectangle

 

cv2.circle(이미지, 중심 좌표, 반지름, 색, 굵기)

 

img = np.zeros((300, 300, 3))
cv2.circle(img, (100, 100), 30, (255, 0, 0), cv2.FILLED)
cv2.imshow("image", img)

circle

참고

https://www.youtube.com/watch?v=WQeoO7MI0Bs&t=6363s 

 

728x90
반응형

댓글