컴퓨터 비전

4. OpenCV

인공지능파이썬 2025. 3. 5. 01:07

1.OpenCV
* OpenCV(Open Source Computer Vision Library)는 실시간 컴퓨터 비전 및 이미지 처리를 위한 오픈소스 라이브러리입니다. 
* Python에서 cv2 모듈을 통해 사용할 수 있으며, 이미지 및 영상의 읽기, 변환, 필터링, 객체 검출, 특징 추출 등의 다양한 기능을 제공합니다. 
* 또한, NumPy와의 호환성이 좋아 배열 연산을 활용한 고속 이미지 처리가 가능하며, 머신러닝 및 딥러닝 모델과도 쉽게 연동할 수 있습니다. 
* 주로 얼굴 인식, 객체 추적, 증강 현실(AR), 자율 주행 등의 분야에서 널리 활용됩니다.

 

Visual Studio Code를 이용한 OpenCV 예제를 알아보겠습니다.

 

※가상 환경 만들고 사용하기

1. python -m venv venv 파일로 가상 폴더를 만들어준다.

2. 만들어준뒤, activates 실핼하면 가상 환경이 실행된다.

예시)

 

3. import cv2 를 위해 pip install opencv-python 를 설치해준다

 

2. 영상
* 영상(image 또는 video)은 디지털 형태로 표현된 시각적 정보로, 픽셀 단위로 구성된 2차원 또는 3차원 데이터입니다. 
* 정지된 이미지는 일반적으로 그레이스케일(흑백) 또는 RGB(컬러) 채널을 가지며, 연속된 이미지 프레임의 집합인 동영상은 시간에 따른 영상 데이터로 볼 수 있습니다. 

 

2-1. 그레이스케일 영상
* 그레이스케일(Grayscale) 영상은 흑백 영상으로, 각 픽셀이 밝기 정보만 포함하는 1채널 영상입니다. 일반적으로 0(검은색)에서 255(흰색) 사이의 값으로 표현되며, 중간값일수록 회색 톤을 가집니다. 
* RGB(컬러) 영상에서 색상 정보를 제거하고 밝기 정보만 남기는 방식으로 변환할 수도 있습니다. 
* 주로 엣지 검출, 객체 인식, 얼굴 탐지 등에서 연산량을 줄이고 효율적인 처리를 위해 사용됩니다.

 

2-2. 트루컬러 영상
* 트루컬러(True Color) 영상은 RGB(Red, Green, Blue) 3채널을 사용하여 색상을 표현하는 컬러 영상입니다. 각 픽셀은 세 가지 색상의 조합으로 표현되며, 일반적으로 각 채널이 0~255 범위의 값을 가집니다. 
* 즉, 하나의 픽셀은 (R, G, B) 값의 조합으로 이루어져 있어 총 약 1677만(256³) 가지의 색상을 표현할 수 있습니다. 
* 트루컬러 영상은 현실적인 색상을 유지하기 때문에 사진, 영상 스트리밍, AR/VR, 자율주행 등의 다양한 응용 분야에서 사용됩니다.

 

dog.bmp 파일 다운 

dog.bmp를 다운

 

예시 1)

#opencv.py 파일
import cv2

print('현재 openCV 버전: ', cv2.__version__) # 현재 openCV 버전:  4.11.0

 

예시 2)

import cv2 

# 그레이스케일(흑백) 영상 불러오기
img1 = cv2.imread('./images/dog.bmp', cv2.IMREAD_GRAYSCALE)  # 이미지를 그레이스케일(1채널)로 불러옴
print(img1)  # img1 배열 출력 (픽셀 값이 2차원 배열 형태로 저장됨)

# 트루컬러(BGR) 영상 불러오기
img2 = cv2.imread('./images/dog.bmp', cv2.IMREAD_COLOR)  # 컬러 영상(3채널, BGR 형식)로 불러옴 (cv2.IMREAD_COLOR는 기본값이라 생략 가능)
print(img2)  # img2 배열 출력 (픽셀 값이 3차원 배열 형태로 저장됨)

# 불러온 영상 출력
cv2.imshow('img1', img1)  # 그레이스케일 영상 창 열기
cv2.imshow('img2', img2)  # 컬러 영상 창 열기

cv2.waitKey()  # 키 입력이 있을 때까지 창을 유지
cv2.destroyAllWindows()  # 모든 창 닫기
--->
[[ 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]]
[[[146  82  41]
  [160  96  55]
  [167 103  62]
  ...
  [ 87  42  15]
  [ 85  42  15]
  [ 83  42  17]]

 [[140  76  35]
  [152  86  45]
  [164  98  57]
  ...
  [ 80  37  10]
  [ 75  35   7]
  [ 71  31   6]]

 [[132  68  27]
  [134  68  27]
  [142  76  35]
  ...
  [ 79  39  11]
  [ 72  33   5]
  [ 65  28   2]]

 ...

 [[ 42  81 120]
  [ 43  85 127]
  [ 42  87 131]
  ...
  [191 125  90]
  [198 132  97]
  [188 122  87]]

 [[ 42  72 107]
  [ 44  80 118]
  [ 43  84 123]
  ...
  [190 124  89]
  [184 118  83]
  [189 123  88]]

 [[ 42  64  92]
  [ 40  68  99]
  [ 40  74 110]
  ...
  [189 122  89]
  [201 134 101]
  [184 117  84]]]

--->

img1의 그레이스케일 결과 

 

img2의 BGR결과

 

 

 

예시 3)

import cv2  
import matplotlib.pyplot as plt  # Matplotlib (영상 출력용)

# 그레이스케일(흑백) 영상 불러오기
img_gray = cv2.imread('./images/dog.bmp', cv2.IMREAD_GRAYSCALE)  # 흑백 이미지로 불러오기

# 컬러(BGR) 영상 불러오기
img_color = cv2.imread('./images/dog.bmp')  # 기본적으로 OpenCV는 BGR 형식으로 이미지를 불러옴
img_color = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)  # OpenCV의 BGR 형식을 Matplotlib에서 사용 가능한 RGB 형식으로 변환

# 첫 번째 서브플롯 (그레이스케일 영상)
plt.subplot(121)  # 1행 2열 중 첫 번째 플롯
plt.axis('off')  # 축 제거
plt.imshow(img_gray, cmap='gray')  # 흑백 이미지 표시 (cmap='gray' 설정 필요)

# 두 번째 서브플롯 (컬러 영상)
plt.subplot(122)  # 1행 2열 중 두 번째 플롯
plt.axis('off')  # 축 제거
plt.imshow(img_color)  # RGB 이미지 표시 (BGR을 RGB로 변환했으므로 그대로 사용 가능)

# 그래프 출력
plt.show()  # 두 개의 이미지 출력

-->

 

 

예시 4)

import cv2  # OpenCV 라이브러리 임포트

# 그레이스케일(흑백) 영상 불러오기
img_gray = cv2.imread('./images/dog.bmp', cv2.IMREAD_GRAYSCALE)

# 이미지의 데이터 타입과 속성 출력
print('img_gray type: ', type(img_gray))  # numpy.ndarray 타입 확인
print('img_gray shape: ', img_gray.shape)  # 이미지의 크기 확인 (height, width)
print('img_gray dtype: ', img_gray.dtype)  # 픽셀 데이터 타입 (uint8)

# 컬러(BGR) 영상 불러오기
img_color = cv2.imread('./images/dog.bmp')  # 컬러 영상 불러오기 (기본적으로 BGR 형식)

# 이미지의 데이터 타입과 속성 출력
print('img_color type: ', type(img_color))  # numpy.ndarray 타입 확인
print('img_color shape: ', img_color.shape)  # (height, width, channel) -> 3채널 (BGR)
print('img_color dtype: ', img_color.dtype)  # 픽셀 데이터 타입 (uint8)

# 이미지의 높이(height)와 너비(width) 추출
h, w = img_color.shape[:2]  # 채널 정보 제외한 height, width만 가져오기
print(f'이미지 사이즈:  {w} * {h}')  # 이미지 크기 출력 (너비 * 높이)

# 영상이 컬러인지, 그레이스케일인지 판별
if len(img_color.shape) == 3:  # shape 길이가 3이면 (height, width, channels) -> 컬러 영상
    print('컬러 영상')
elif len(img_gray.shape) == 2:  # shape 길이가 2이면 (height, width) -> 그레이스케일 영상
    print('그레이스케일 영상')

# 특정 색상으로 영상 변경 (BGR 형식) → (255, 102, 255) (밝은 분홍색)
# 기존 코드:
# for x in range(h):
#     for y in range(w):
#         img_color[x, y] = (255, 102, 255)

# 위의 반복문을 간결하게 한 코드:
img_color[:, :] = (255, 102, 255)  # 모든 픽셀을 (255, 102, 255)로 변경 (행렬 전체에 적용)

# 변경된 이미지를 화면에 표시
cv2.imshow('img_color', img_color)
cv2.waitKey()  # 키 입력이 있을 때까지 대기
cv2.destroyAllWindows()  # 모든 창 닫기
--->
img_gray type:  <class 'numpy.ndarray'>
img_gray shape:  (364, 548)
img_gray dtype:  uint8
img_color type:  <class 'numpy.ndarray'>
img_color shape:  (364, 548, 3)
img_color dtype:  uint8
이미지 사이즈:  548 * 364
컬러 영상

--->

 

예시 5)

import cv2  # OpenCV 라이브러리 임포트
import numpy as np  # NumPy 라이브러리 임포트 (배열 생성 및 조작을 위한 라이브러리)

# (240, 320, 3) 크기의 컬러 영상(검은색) 생성
img1 = np.zeros((240, 320, 3), dtype=np.uint8)  
# 모든 픽셀이 (0, 0, 0) → 검은색(BGR)

# (240, 320) 크기의 초기화되지 않은 그레이스케일 영상 생성
img2 = np.empty((240, 320), dtype=np.uint8)  
# 메모리 상의 임의의 값(쓰레기 값)으로 초기화됨 (화면에 노이즈가 보일 수 있음)

# (240, 320) 크기의 그레이스케일 영상(회색, 픽셀값 130) 생성
img3 = np.ones((240, 320), dtype=np.uint8) * 130  
# 모든 픽셀이 130 (회색 톤)

# (240, 320, 3) 크기의 컬러 영상(밝은 분홍색) 생성
img4 = np.full((240, 320, 3), (255, 103, 255), dtype=np.uint8)  
# 모든 픽셀이 (255, 103, 255) → 밝은 분홍색(BGR)

# 생성된 영상들을 화면에 표시
cv2.imshow('img1', img1)  # 검은색 이미지
cv2.imshow('img2', img2)  # 메모리 쓰레기 값이 포함된 이미지 (랜덤 패턴처럼 보일 수 있음)
cv2.imshow('img3', img3)  # 회색 이미지 (밝기 130)
cv2.imshow('img4', img4)  # 밝은 분홍색 이미지 (BGR: 255, 103, 255)

cv2.waitKey()  # 키 입력이 있을 때까지 창 유지
cv2.destroyAllWindows()  # 모든 창 닫기

--->

4개의 결과 출력

 

예시 6)

import cv2 
import numpy as np  # NumPy (이미지 배열 생성)

# 500x500 크기의 흰색 배경(255,255,255) 이미지 생성
img = np.full((500, 500, 3), 255, np.uint8)  

# 빨간색 선 그리기 (시작점 (70,70) → 끝점 (400,70), 색상 (0,0,255) → 빨간색, 두께 5)
cv2.line(img, (70,70), (400, 70), (0, 0, 255), 5)

# 초록색 사각형 윤곽선 그리기 (좌측 상단 (50,200), 크기 (150x100), 색상 (0,255,0) → 초록색, 두께 3)
cv2.rectangle(img, (50, 200, 150, 100), (0, 255, 0), 3)

# 초록색 사각형 내부 채우기 (좌측 상단 (300,200), 크기 (150x100), 색상 (0,255,0) → 초록색, 내부 채움(-1))
cv2.rectangle(img, (300, 200, 150, 100), (0, 255, 0), -1)

# 파란색 원 그리기 (중심 (150,400), 반지름 50, 색상 (255,0,0) → 파란색, 두께 3)
cv2.circle(img, (150, 400), 50, (255, 0, 0), 3)

# 검은색 텍스트 그리기 ('Hello OpenCV', 위치 (50,300), 글꼴, 크기 0.8, 색상 (0,0,0) → 검정색)
cv2.putText(img, 'Hello OpenCV', (50, 300), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 0))

# 생성된 이미지 표시
cv2.imshow('img', img)
cv2.waitKey()  # 키 입력 대기
cv2.destroyAllWindows()  # 모든 창 닫기

--->

728x90
LIST

'컴퓨터 비전' 카테고리의 다른 글

OCR  (6) 2025.03.06
4-(2). OpenCV  (0) 2025.03.05
3. 포켓몬 분류 데이터셋  (7) 2025.03.04
2. Classification  (0) 2025.02.28
1. 컴퓨터 비전(Computer Vision)  (4) 2025.02.28