본문 바로가기
CV(Computer Vision)

컴퓨터 비전과 OpenCV

by 코낄2 2024. 2. 9.

컴퓨터 비전은 인공지능의 한 분야로, 디지털 이미지, 비디오 및 기타 시각적 입력에서 의미 있는 정보를 추출하고 이를 활용하여 작업을 실행하는 기술을 다룹니다. 이를 위해 사용되는 도구 중 하나가 OpenCV(Open Source Computer Vision library)입니다. OpenCV는 오픈소스 라이브러리로서 컴퓨터 비전 및 이미지 처리를 위한 강력한 도구를 제공합니다.

1. OpenCV

  • 컴퓨터 비전과 이미지 처리를 위한 오픈소스 라이브러리입니다.
  • OpenCV는 1999년 Intel에서 영상처리 기술을 개발하기 위한 목적으로 시작되었습니다.
  • 2000년에 BSD 라이센스로 배포되었으며, 이후 지속적인 업데이트와 개선이 이뤄졌습니다.
  • 2011년 이후 OpenCV2로 개발이 이어졌으며, 현재는 OpenCV4가 주요 버전으로 사용되고 있습니다.

2. OpenCV 설치

pip install opencv-python

# opencv만 쓰면 다른 라이브러리가 설치되니 주의!

# 파이참에서 설치하기:

파이참 메뉴 >> settings >> project 이름 >> python interpreter >> '+'클릭 후 opencv-python 검색 >> install package 클릭

3. 컴퓨터 비전(Computer Vision)

- 영상 처리, 동영상 처리, 객체 탐지, 패턴 인식, 광학 문자 인식 등에서 활용

  • 영상 처리: 영상의 필터링, 변환, 보정 등을 수행합니다.
  • 동영상 처리: 동영상 파일에서 프레임을 읽고 처리합니다.
  • 객체 탐지: 이미지나 동영상에서 특정 객체를 찾아내는 기능을 제공합니다.
  • 패턴 인식: 이미지에서 특정 패턴이나 물체를 인식하는 기능을 지원합니다.
  • 광학 문자 인식(OCR): 이미지나 동영상 속 문자를 인식하고 텍스트로 추출할 수 있습니다.

4. 영상(Image)

영상(Image)은 이미지를 구성하는 가장 작은 단위인 픽셀(pixel)로 이루어진 것을 말합니다. 이러한 픽셀들은 바둑판 모양의 2차원 행렬 형태로 배열되어 있습니다.

  • 그레이스케일 영상
    • 흑백 사진과 같이 색상 정보가 없는 영상입니다.
    • 픽셀은 밝기 정보만으로 구성되며, 이는 0부터 255까지의 256단계로 표현됩니다.
    • 보통 numpy.uint8 데이터 타입으로 나타내며, 한 픽셀은 8비트 즉, 1바이트로 표현됩니다.
    • 예를 들어, 28 * 28 크기의 이미지는 가로크기 * 세로크기인 784바이트의 데이터로 이루어집니다.
  • 트루컬러 영상
    • 컬러 사진과 같이 색상 정보를 가지고 있기 때문에 다양한 색상을 표현할 수 있는 영상입니다.
    • Red, Green, Blue 세 가지 색 성분을 사용하며, 각 색상은 256단계로 표현됩니다.
    • 픽셀은 튜플 형태로 표현되며, 예를 들어 (255, 255, 255)와 같이 흰색을 나타냅니다.
    • numpy.ndarray 데이터 타입으로, 3개의 색상으로 이루어져 있기 때문에 한 픽셀은 3바이트로 표현됩니다.
    • 따라서 28 * 28 크기의 트루컬러 이미지는 가로 * 세로 * 3인 2352바이트의 데이터로 이루어집니다.
  • 영상 파일 형식
    • bmp: 픽셀 정보를 압축하지 않고 그대로 저장하는 형식으로 용량이 큽니다. 파일 구조가 단순하여 별도의 라이브러리 없이도 프로그래밍이 가능합니다.
    • jpg, jpeg: 손실 압축 방식을 사용합니다. 압축률이 높아서 파일 용량이 감소하며, 컬러 영상을 저장하는 데 주로 사용됩니다.
    • gif: 움직이는 영상을 지원하며, 256색 이하의 영상을 저장합니다. 무손실 압축 방식을 사용합니다.
    • png: 웹 이미지에 주로 사용되며, 무손실 및 손실 압축 방식을 모두 지원합니다. 또한 알파 채널을 지원하여 투명도를 나타낼 수 있습니다. # (255, 255, 255, 1) > 투명도 채널이 하나 더 있음

5. 영상의 출력

영상 읽기

image = cv2.imread('영상 파일 경로', 방법)
  • IMREAD_GRAYSCALE: 그레이스케일로 읽기
  • IMREAD_COLOR: 트루컬러로 읽기 (기본값). 읽어들인 영상의 색상 정보는 BGR 순서로 표현됩니다.
import cv2

print('현재 opencv 버전: ', cv2.__version__)
// 현재 opencv 버전:  4.9.0

img = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
print(img)
[[ 77  91  98 ...  39  39  39]
 [ 71  81  93 ...  34  31  28]
 [ 63  63  71 ...  35  29  24]
 ...
 [ 88  93  95 ... 122 129 119]
 [ 79  87  91 ... 121 115 120]
 [ 70  74  81 ... 120 132 115]]
# 그레이스케일 영상
img = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
cv2.imshow('img', img) # 창이름, 영상
cv2.waitKey()  #키를 입력할 때까지 대기

# 트루 컬러 영상
img = cv2.imread('./dog.bmp')
cv2.imshow('img', img)
cv2.waitKey()

BGR을 RGB로 변환

img_color = cv2.imread('./dog.bmp')
rgb_image = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)
bgr_image = cv2.cvtColor(img_color, cv2.COLOR_RGB2BGR)

BGR/ RGB 변환: cv2.cvtColor(영상, 변환방법)
    cv2.COLOR_BGR2RGB: BGR을 RGB로 변환
    cv2.COLOR_RGB2BGR: RGB을 BGR로 변환

차원

  • type(변수명): 변수명의 데이터 타입을 확인합니다. 일반적으로 OpenCV로 읽은 영상은 numpy.ndarray 형식입니다.
  • 변수명.shape: 영상의 차원을 확인합니다. 주로 (세로, 너비) 형태로 나타나며, 컬러 영상의 경우에는 (세로, 너비, 채널수) 형태로 나타납니다. >> (세로, 너비) 또는 (세로, 너비, 채널수)
  • 변수명.dtype: 영상의 데이터 타입을 확인합니다. 주로 uint8로 나타나며, 8비트 부호 없는 정수형을 의미합니다.
img_gray = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
print('img_gray type: ', type(img_gray)) // img_gray type:  <class 'numpy.ndarray'>
print('img_gray shape: ', img_gray.shape) // img_gray shape:  (364, 548) # 높이, 너비
print('img_gray dtype: ', img_gray.dtype) // img_gray dtype:  uint8

img_color = cv2.imread('./dog.bmp')
print('img_color type: ', type(img_color)) // img_color type:  <class 'numpy.ndarray'>
print('img_color shape: ', img_color.shape) // img_color shape:  (364, 548, 3)
print('img_color dtype: ', img_color.dtype) // img_color dtype:  uint8
  • 너비 * 높이 순서로 변경해보기
img_shape_transposed = img_color.transpose((1, 0, 2)) 

print('img_color shape: ', img_shape_transposed.shape)
//img_color shape:  (548, 364, 3)

# 또는
h, w  = img_color.shape[:2]
print(f'img_color 사이즈: {w}*{h}') // img_color 사이즈: 548*364
  • 그레이스케일 영상인지 컬러 영상인지 구별하는 프로그램
def colorORgray(img):
    if len(img.shape) == 3:
        print('img는 컬러 영상입니다.')
    else:
        print('img는 그레이스케일 영상입니다.')

colorORgray(img_gray) // img는 그레이스케일 영상입니다.
  • 특정 색으로 영상을 출력 BGR (255, 102, 255)
img_color[:,:] = (255, 102, 255)
cv2.imshow('img_color', img_color)
cv2.waitKey()

  • 기본 이미지 생성하기
import cv2
import numpy as np

# 240(세로) * 320(가로) 크기의 3컬러채널 이미지 생성
img1 = np.zeros((240, 320, 3), dtype=np.uint8)
// 검정색 이미지 생성
img2 = np.empty((240, 320), dtype=np.uint8)
// 검정색 이미지 생성
img3 = np.ones((240, 320), dtype=np.uint8) * 130
// 130 밝기정보의 그레이스케일 이미지 생성
img4 = np.full((240, 320,3), (255, 102, 255), dtype=np.uint8)
// (255, 102, 255)컬러의 컬러 이미지 생성

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)
cv2.waitKey()

  • 이미지 카피하기
img = cv2.imread('./dog.bmp')
img_test = img # 같은 주소값을 공유하는 변수
img_copy = img.copy()

# x좌표가 91~210, y좌표가 125~245까지 영역에 (255, 102, 255) 색상으로 설정
img_test[91:210, 125:245] = (255, 102, 255) # 원본도 같이 바뀜
img_copy[91:210, 125:245] = (255, 255, 255)

cv2.imshow('img', img)
cv2.imshow('img_test', img_test)
cv2.imshow('img_copy', img_copy)
cv2.waitKey()

 

6. 도형 그리기

OpenCV를 사용하여 영상 상에 다양한 도형을 그릴 수 있습니다.

직선 그리기

cv2.line(영상, 시작점 좌표 튜플, 끝점 좌표 튜플, 선색상, 선두께, 선타입)

사각형 그리기

cv2.rectangle(영상, 좌상단 꼭지점 좌표 튜플, 우하단 꼭지점 좌표 튜플, 선색상, 선두께)

원 그리기

cv2.circle(영상, 중심 좌표 튜플, 반지름, 선색상, 선두께)

✔️ 사각형과 원은 선 두께를 -1로 설정하면 내부를 색상으로 채움

문자열 출력

cv2.putText(영상, 문자열, 출력 위치 좌표 튜플, 글꼴, 폰트 크기, 색상)
img = np.full((500,500,3), 255, np.uint8)

cv2.line(img, (70,70),(200,70), (0,0,255), 5)

cv2.rectangle(img, (50,200,150,100),(0,255,0), -1) 
# 초기좌표 50,200에서 가로150, 세로100만큼 이동

cv2.circle(img, (300,100), 50, (255, 255, 0), 3)

str = 'Hello OpenCV!'
cv2.putText(img, str, (30,300), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,0,0))

cv2.imshow('img', img)
cv2.waitKey()

'CV(Computer Vision)' 카테고리의 다른 글

영상의 변환/ 적응형 이진화/ 유사도  (0) 2024.02.25
관심 영역/ 이진화  (0) 2024.02.18
이미지 처리 기법  (0) 2024.02.16
영상처리 기초 : 화소처리  (0) 2024.02.10
동영상 처리  (0) 2024.02.09