Python/Pycharm OpenCV 기초

2023. 9. 22. 14:23파이썬/OpenCV

1. OpenCv(Open Source Computer Vision Library)
- 컴퓨터 비전과 이미지 처리를 위한 오픈소스 라이브러리
- 1999년 인텔에서 영상 처리 기술을 개발하기 위한 목적
- 2000년 BSD 라이센스로 배포
- 2011년 이후 OpenCV2로 개발 시작

✔ OpecnCV 설치
pip install opencv-python

2. Computer Vision
- 디지털 이미지나 비디오에서 정보를 추출하고, 해석하는 기술과 분야
- 이미지 처리, 객체 탐지, 패턴 인식, 광학 문자 인식(OCR)......

3. 영상(image)
- 픽셀(pixel)
-이미지를 구성하는 최소 단위
-바둑판 모양의 격자에 나열되어 있는 형태, 2차원 행렬영상의 종류

- 그레이 스케일 영상
- 흑백 사진처럼 색상 정보가 없는 영상
- 밝기 정보만 가지고 있음
- 밝기 정보는 256단계로 표현 (0~255)
- 파이썬에서 numpy.uint8 타입으로 표현 = 8bit = 1byte
- 예시 :  가로크기 * 세로 크기 = 28 * 28 = 784byte

- 트루 컬러 영상
- 컬러사진처럼 색상 정보를 가지고 있기 때문에 다양한 색상을 표현할 수 있음
- red,green,blue 색 성분을 사용하고, 각 256 단계로 표현
- 픽셀의 표현 -> 튜플 형태로 (255,255,255) - numpy.ndarray = 1개당 3byte
- 가로크기 * 세로크기 * 3 = 28 * 28 * 3 = 2352 bytes

- 영상 파일 형식
- bmp
- 픽셀 데이터를 압축하지 않고 그대로 저장
- 용량이 상대적으로 크다
- 파일 구조가 단순해서 별도의 라이브러리 없이 프로그래밍이 가능

- jpg, jpeg
- 압축률이 좋아서 파일 용량이 크게 감소
- 사진과 같은 컬러영상을 저장할 때 사용
- 손실 압축

-gif
- 움직이는 영상을 지원
- 256색 이하 영상을 저장할 때 사용
- 무손실 압축

-png
- 웹 이미지용으로 권장
- 무손실, 손실 압축
- 알파 채널(투명도)를 지원

✔ 영상 출력
- 그레이 스케일 영상 출력
-cv2.IMREAD_GRAYSCALE 을 사용
-img.shape: (H,W)

- 컬러 영상 출력
-cv2.imread() 메소드로 불러온 영상의 색상 정보는 BGR 순서
-matplotlib에서 출력하려면 RGB 순서로 변경해야 하기 때문에 cv2.cvtColor()메소드를 사용
-img.shape: (H,W,3)

4. 도형 그리기
- 직선 그리기
- cv2.line(영상, 직선의 시작점과 끝점, 선 색상, 선 두께, 선 타입...)

-사각형 그리기
- cv2.rectangle(영상, 사각형 꼭지점 좌표, 선색상, 선 두께)
- 선 두께가 -1로 설정하면 사각형 내부를 색상으로 채움

- 원 그리기
- cv2.circle(영상, 원의 중앙좌표, 반지름, 선 색상, 선 두께)
- 선 두께가 -1로 설정하면 원 내부를 색상으로 채움

- 문자열 출력하기
- cv2.putText(영상, 문자열, 영상에서 문자열을 출력할 위치 좌표, 글꼴, 폰트크기)

5. 동영상 처리하기
- cv2.VideoCapture 클래스
- 카메라와 동영상으로부터 프레임(frame)을 받아오는 작업을 처리함
- 카메라 영상 얻어오기
-cv2.VideoCapture(index)
-index: 시스템의 기본 카메라를 open하려면 0 혹은 카메라 고유의 값
-cv2.VideoCapture.isOpened()
-True: 성공
-cv2.CAP_PROP_FRAME_WIDTH : 카메라로 읽어들인 영상의 가로 사이즈
-cv2.CAP_PROP_FRAME_HEIGHT : 카메라로 읽어들인 영상의 세로 사이즈
-cv2.VideoCapture.read() 'ret' 영상이 정상적으로 리턴되었는지 여부(True,False) 'frame' 영상(그레이 스케일 영상 또는 컬러 영상)

- 동영상일 때 
- cv2.VideoCapture(파일명)
- pixbay에서 파일 다운해서 예제로 해보기
- 동영상 입력
- cv2.VideoCapture(파일명)
- 동영상 출력 - FourCC(Four Character Code) -4byte로 된 문자열이며, 데이터 형식을 구분하는 고유 글자
- 주로 avi 파일의 영상 코덱을 구분할 때 사용 - Divx, Xvid, H264
- 예시) cv2.VideoWriter_fourcc(*'DIVX')
- 예시) cv2.VideoWriter_fourcc(*'XVID')
- 예시) cv2.VideoWriter_fourcc(*'MP4V')

- 파일 저장
- cv2.VideoWriter(파일명,Fourcc객체, fps, 프레임사이즈, 컬러영상여부)
- 프레임 사이즈 (w,h) 튜플 - 컬러 영상 여부 : True(컬러) / False(그레이 스케일)

✔ 문제무료 동영상 사이트에서 동영상 2개를 다운 받아서 두 동영상을 연결하는 프로그램을 만들어보자
(단 2개의 동영상의 해상도는 같아야 함)

 

 


사진 띄워보기

import cv2

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

img = cv2.imread('./dog.bmp')

#띄워보기 (창이름, 영상객체)
cv2.imshow('img',img)

#창을 유지시키기
cv2.waitKey()

 

 

 


그레이 스케일과 컬러 동시에 띄우기

import cv2
import matplotlib.pyplot as plt

# 그레이 스케일이랑 컬러버전 동시에 띄우기
img_gray = cv2.imread('./dog.bmp',cv2.IMREAD_GRAYSCALE)
img_bgr = cv2.imread('./dog.bmp')
img_rgb = cv2.cvtColor(img_bgr,cv2.COLOR_BGR2RGB)

#1행 2열 1번쨰 인덱스
plt.subplot(121)
plt.axis('off')
plt.imshow(img_gray,cmap='gray')

#1행 2열 1번쨰 인덱스
plt.subplot(122)
plt.axis('off')
plt.imshow(img_rgb)
plt.show()

728x90