1. 영상(Image)
- 픽셀이 바둑판 모양의 격자에 나열되어 있는 형태
- 픽셀: 이미지를 구성하는 가장 작은 단위
- 2차원 행렬
1-1. 그레이스케일 영상
- 흑백 사진처럼 색상 정보가 없는 여상
- 밝기 정보만으로 구성된 영상
- 밝기 정보는 256단계로 표현(0 ~ 255)
- 8bit에 저장 = 1byte
- 가로크기 * 세로크기 = 이미지 용량
- 예) 28* 28 = 784 bytes
1-2. 트루컬러 영상
- 컬러 사진처럼 색상 정보를 가지고 있기 때문에 다양한 색상을 표현할 수 있는 영상
- 밝기 정보만으로 구성된 영상
- 밝기 정보는 256단계로 표현(0 ~ 255)
- 8bit에 저장 = 1byte
- 가로크기 * 세로크기 = 이미지 용량
- 예) 28* 28 = 784 bytes
1-3. 영상 파일 형식
- bmp
- 픽셀 데이터를 압축하지 않고 그대로 저장
- 용량이 매우 큼(픽셀의 일반적인 크기)
- 파일 구조가 단순해서 별도의 라이브러리 없이 프로그래밍이 가능
- jpg, jpeg
- 픽셀 데이터를 압축하지 않고 그대로 저장
- 용량이 매우 큼(픽셀의 일반적인 크기)
- 파일 구조가 단순해서 별도의 라이브러리 없이 프로그래밍이 가능
- gif
- 움직이는 영상 지원
- 256색 이하의 영상을 저장
- 무손실 압축
- png
- 웹 이미지용으로 권장
- 무손실, 손실 압축
- 알파 채널(투명도)을 지원
- (255, 255, 255, 1)
2. OpenCV-Python 모듈
- OpenCV
- 컴퓨터 비전과 이미지 처리를 위한 오픈소스 라이브러리
- 1999년 Intel에서 영상처리 기술을 개발하기 위한 목적으로 만들어짐
- 2000년 BSD 라이센스로 배포
- 2011년 이후 OpenCV2로 개발 시작 (현재 버전은 OpenCV4, 지금까지 불리는 명칭은 OpenCV2)
- OpenCV 설치
- pip install opencv-python
- import cv2
- 동영상 출력하기 (Four Character Code)
- 4바이트로 된 문자열이며 데이터 형식을 구분하는 고유 글자
- 주로 AVI 파일의 영상 코덱을 구분할 때 사용
- cv2.VideoWriter.fourcc('DIVX') // Divx
- cv2.VideoWriter.fourcc(*'XVID') // Xvid
- cv2.VideoWriter.fourcc(*'MP4VD') // MP4V
2-1. OpenCV
import cv2
print('현재 openCV 버전:', cv2.__version__)
# 그레이스케일 영상
# img = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
# print(img)
# 트루 컬러 영상
img = cv2.imread('./dog.bmp', cv2.IMREAD_COLOR)
print(img)
cv2.imshow('img',img)
cv2.waitKey()
2-2. matplotlib
# matplotlib를 통해 그레이스케일로 출력
img = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
plt.axis('off')
plt.imshow(img,cmap='gray')
plt.show()
# matplotlib을 통해 트루컬러로 출력 / matplotlib:RGB, opencv: BGR
img = cv2.imread('./dog.bmp')
plt.axis('off')
plt.imshow(img)
plt.show()
# matplotlib을 통해 트루컬러로 출력
img = cv2.imread('./dog.bmp')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR -> RGB
plt.axis('off')
plt.imshow(img)
plt.show()
# subplot 이용하여 left plot에는 gray scale 영상, right plot에는 color영상을 출력
img1 = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('./dog.bmp')
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
plt.subplot(121)
plt.axis('off')
plt.imshow(img1, cmap='gray')
plt.subplot(122)
plt.axis('off')
plt.imshow(img2)
plt.show()
2-3. image info
import cv2
img_gray = cv2.imread('./dog.bmp', cv2.IMREAD_GRAYSCALE)
print('img_gray type: ', type(img_gray))
print('img_gray shape: ', img_gray.shape)
print('img_gray dtype: ', img_gray.dtype)
img_color = cv2.imread('./dog.bmp')
print('img_color type: ', type(img_color))
print('img_color shape: ', img_color.shape) # (세로, 가로, 채널)
print('img_color dtype: ', img_color.dtype)
h, w = img_color.shape[:2]
print(f'이미지 사이즈: {w}*{h}')
# 그레이스케일 영상인지, 컬러영상인지 구분하기
if len(img_color.shape) == 3:
print('컬러 영상')
elif len(img_color.shape) == 2:
print('그레이스케일 영상')
# img_color이 특정 색 정보로 영상을 출력
# BGR: (255, 102, 255)
import numpy as np
bgr_color = (255, 102, 255) # BGR(255, 102, 255) 색상 (핑크색)
img_color = np.full((364, 548, 3), bgr_color, dtype=np.uint8)
cv2.imshow('img_color', img_color)
cv2.waitKey()
2-4. create image
import cv2
import numpy as np
img1 = np.zeros((240, 320, 3), dtype=np.uint8)
cv2.imshow('img1', img1)
cv2.waitKey()
img2 = np.empty((240, 320), dtype=np.uint8)
cv2.imshow('img2', img2)
cv2.waitKey()
img3 = np.ones((240, 320), dtype=np.uint8) * 130
cv2.imshow('img3', img3)
cv2.waitKey()
img4 = np.full((240, 320, 3), (255,102,255), dtype=np.uint8) # (255,102,255):pink
cv2.imshow('img4', img4)
cv2.waitKey()
2-5. copy image
import cv2
img = cv2.imread('./dog.bmp')
#img_test = img
img_test=img.copy()
img_test [90:210, 120:240] = (255, 102, 255)
cv2.imshow('img',img)
cv2.imshow('img_test',img_test)
cv2.waitKey()
2-6. drawing
import cv2
import numpy as np
# 흰색 배경의 네모 박스 생성
img = np.full((500, 500, 3), 255, np.uint8)
# 빨간색 선(두께5) 생성
cv2.line(img, (100, 70), (200, 70), (0, 0, 255), 5)
cv2.imshow('img', img)
cv2.waitKey()
# 초록색 사각형 생성 # (50,200)의 가로 150 세로 100의 사각형 (x,y,w,h)
cv2.rectangle(img, (50,200,150,100), (0, 255, 0), -1)
# 하늘색 원 생성 (300,100)의 중심점에서 반지름 100의 원
cv2.circle(img,(300, 100), 100, (255, 255, 0), -1)
str = "Hello OpenCV"
# cv2.FONT_HERSHEY_SIMPLE: 글꼴 // 위치: (30, 350) 크기:2 색상 빨강
cv2.putText(img, str, (30, 350), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,0,255))
2-7. cameraIN
import sys
import cv2
cap = cv2.VideoCapture(0) # 파일경뢰 동영상 불러옴, 숫자: 해당 인덱스에 설치된 카메라를 불러옴
if not cap.isOpened():
print('카메라를 열 수 없음')
sys.exit()
print('카메라 연결 성공')
print('가로 사이즈: ', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
print('세로 사이즈: ', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 카메라 실행
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow('frame', frame)
if cv2.waitKey(10)==27: # 10: 0.01초 / 27:ESC키. ESC키를 누르면 꺼짐
break
cap.release()
카메라 작동과 동시에 화면이 출려됨
2-8. videoIN
import cv2
import sys
cap = cv2.VideoCapture('./movie.mp4')
if not cap.isOpened():
print('동영상을 열 수 없습니다')
sys.exit()
# 동영상의 가로, 세로 사이즈, 프레임 수 불러오기
print('가로 사이즈:', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
print('세로 사이즈:', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('프레임 수:', int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))
print('fps:', int(cap.get(cv2.CAP_PROP_FPS)))
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow('frame', frame)
if cv2.waitKey(10) == 27: # 10: 0.01초 / 27:ESC키. ESC키를 누르면 꺼짐
break
cap.release()
2-9. cameraOut
import cv2
cap = cv2.VideoCapture(0)
w = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('output.avi', fourcc, fps, (w, h))
while True:
ret, frame = cap.read()
if not ret:
break
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(10) == 27: # 10: 0.01초 / 27:ESC키. ESC키를 누르면 꺼짐
break
cap.release()
카메라가 켜지고 종료하면 종료시점까지의 영상이 output.avi 파일로 저장됨
2-10. videoOut
# 동영상 2개를 하나로 연결해보기
# 2개의 동영상 사이즈 동일해야 함
import cv2
cap1 = cv2.VideoCapture('./video1.mp4')
cap2 = cv2.VideoCapture('./video2.mp4')
w = round (cap1.get(cv2.CAP_PROP_FRAME_WIDTH))
h = round(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_cnt1 = round(cap1.get(cv2.CAP_PROP_FRAME_COUNT))
frame_cnt2 = round(cap2.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap1.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter.fourcc(*'DIVX')
out = cv2.VideoWriter('mix.avi', fourcc, fps, (w, h))
# 1번 영상 열기
for i in range(frame_cnt1):
ret1, frame1 = cap1.read()
cv2.imshow('output', frame1)
out.write(frame1)
if cv2.waitKey(10) == 27:
break
# 2번 영상 열기
for i in range(frame_cnt2):
ret2, frame2 = cap2.read()
cv2.imshow('output', frame2)
out.write(frame2)
if cv2.waitKey(10) == 27:
break
cap1.release()
cap2.release()
out.release()
1번 영상 이어서
2번 영상 출력
'컴퓨터비전(CV)' 카테고리의 다른 글
6. Open CV5 (0) | 2024.07.14 |
---|---|
5. OpenCV4 (1) | 2024.07.08 |
4. Open CV3 (0) | 2024.07.08 |
3. Open CV2 (0) | 2024.07.08 |
1. 컴퓨터비전(CV) (0) | 2024.07.08 |