1. 영상(Image)
- 픽셀이 바둑판 모양의 격자로 나열되어 있는 형태(2차원 행렬)
- 픽셀 : 이미지를 구성하는 가장 작은 단위
2. 그레이스케일 영상
- 흑백 사진처럼 색상 정보가 없는 영상
- 밝기 정보만으로 구성된 영상을 말합니다.
- 밝기 정보는 총 256단계로 표현 가능(0 ~ 255)
- 1픽셀은 8bit에 저장 = 1 byte
- 가로크기 * 세로크기 = 이미지 용량
예) 28 * 28 = 784 bytes
3. 트루컬러 영상
- 컬러 사진처럼 색상 정보를 가지고 있기 때문에 다양한 색상을 표현할 수 있는 영상
- red, green, blue 색 성분을 사용하고 각 256단계로 표현합니다.
- 픽셀을 표현할때 튜플로 표현합니다 -> (255, 255, 255)
- 1픽셀은 3byte
- 가로크기 * 세로크기 * 3 = 이미지 용량
예) 28 * 28 * 3 = 2352 bytes
4. 영상 파일 형식
BMP
- 픽셀 데이터를 압축하지 않고 그대로 저장
- 용량이 매우 큼(픽셀의 일반적인 크기)
- 파일 구조가 단순해서 별도의 라이브러리 없이 프로그래밍이 가능합니다.
JPG(JPEG)
- 압축률이 좋아서 파일 용량이 크게 감소
- 사진과 같은 컬러영상을 저장
- 손실 압축이라는것을 쓰게 됩니다.
- CTRL + C, V를 반복하면 나중에 압축률이 깨져서 뿌옇게 되는 특징이 있습니다
GIF
- 움직이는 영상 지원(여러사진을 합치기 가능)
- 256색 이하의 영상을 저장
- 무손실 압축이라서 복붙해도 영상이 깨지지 않습니다.
PNG
- 웹 이미지용으로 권장
- 무손실 압축, 손실압축 모두 가능
- 투명도의 채널도 있어서 알파채널(투명도)을 지원함
- 형식(RGB) : ((255, 255, 255, 1), 224, 224)
5.OpenCV-Python 모듈
opencv
- 컴퓨터 비전과 이미지 처리를 위한 오픈소스 라이브러리
- 1999년 인텔에서 영상처리 기술을 개발하기 위한 목적으로 만듦
- 2000년 BSD 라이선스로 배포
- 2011년 이후 opencv2로 개발 시작
== 영상에 효과를 주거나 필요에 의해서 전처리를 할 때 사용하기 쉽게 다루기 위해 사용.
opencv 설치
pip install opencv-python
모듈 불러오기
import cv2
6.동영상 다루기
카메라 영상 불러오기
cv2.VideoCapture(0) #해당 인덱스에 설치된 카메라를 불러옴
동영상 불러오기
cv2.VideoCapture('파일경로') # 해당 파일경로의 동영상을 불러옴
동영상 출력하기
FourCC(Four Cgaracter Code)
-4바이트로 된 문자열이며 데이터 형식을 구분하는 고유 글자를 의미한다.
-주로 AVI 파일의 영상 코덱을 구분할 때 사용(DIVX, XVID, MP4V ..)
예) cv2.VideoWriter_fourcc(*'DIVX')
cv2.VideoWriter('파일경로', FourCC, 초당 프레임 수, (가로크기, 세로크기))
cv2 모듈 사용해보기
import cv2
print('현재 OpenCV 버전: ', cv2.__version__)
#그레이스케일 영상
img = cv2.imread('../dog.bmp', cv2.IMREAD_GRAYSCALE)
print(img)
cv2.imshow('img', img)
cv2.waitKey()
위 이미지를 가지고 확인하려고 합니다.
OPEN CV 모듈을 가지고 확인하려고 하고 왼쪽이 원본 오른쪽이 크레이스케일 영상으로 프린트 된 모습입니다.
여기서 그레이스케일을을 넣지않으면 그냥 트루컬러로 됩니다.
2_matplotlib.py
matplotlib으로 출력해보기
이 이미지는 x를 눌러야 닫힙니다.
import cv2
import matplotlib.pyplot as plt
#cv2를 통해 그레이스케일로 불러온 후 matplontlib으로 그레이스케일 영상 출력
img = cv2.imread('../dog.bmp', cv2.IMREAD_GRAYSCALE)
# cv2.imshow('img', img)
# cv2.waitKey()
plt.axis('off')
plt.imshow(img, cmap='gray')
plt.show()
#cv2를 통해 컬러로 불러온 후 matplontlib으로 컬러영상 출력
#OpenCV: BGR matplotlib: RGB
img=cv2.imread('../dog.bmp')
plt.axis('off')
plt.imshow(img)
plt.show()
RBG가 아니라 BGR순서로 출력하기떄문에 스머프 스타일이 나온다.
다시 원래대로 만들려면 BRG을 RBG 순서로 변경해주어야합니다.
#cv2를 통해 컬러로 불러온 후 matplontlib으로 컬러영상 출력
img=cv2.imread('../dog.bmp')
img= cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.axis('off')
plt.imshow(img)
plt.show()
cv2.COLOR_BGR2RGB을 사용하면 다시 순서가 잘 바뀌어서 정상적인것으로 확인될 수 있습니다.
#subplot을 이용하여 왼쪽에는 그레이스케일 영상, 오른쪽에는 컬러영상을 출력해보자
img_gray = cv2.imread('../dog.bmp', cv2.IMREAD_GRAYSCALE)
img_color = cv2.imread('../dog.bmp')
img_color = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)
plt.subplot(121) #1행 2열의 첫번째
plt.axis('off')
plt.imshow(img_gray, cmap='gray')
plt.subplot(122) #1행 2열의 두번째
plt.axis('off')
plt.imshow(img_color)
plt.show()
왼쪽에는 gray. 오른쪽에는 컬러영상을 확인할 수 있습니다.
open cv로 불러온 영상을 들여다보는 실습입니다.
import cv2
img_gray = cv2.imread('../dog.bmp', cv2.IMREAD_GRAYSCALE)
print('img_gray type: ', type(img_gray)) #<class 'numpy.ndarray'>
print('img_gray shape: ', img_gray.shape) #(364, 548) #이미지의 크기를 나타냅니다.
#이미지파일은 세로, 가로로 불러오게 됩니다.
print('img_gray dtype: ', img_gray.dtype) #uint8(음수를 표현하지 못하는 256까지 표현할 수 있다는 뜻)
img_color = cv2.imread('../dog.bmp', cv2.IMREAD_GRAYSCALE)
print('img_gray type: ', type(img_color))
print('img_gray shape: ', img_color.shape) #(세로, 가로, 컬러) #컬러가 뒤에있음!!
print('img_gray dtype: ', img_color.dtype)
이러면 open cv로불러올떄 전처리를 할때 순서를 배치사이즈를 어떻게 넣었는지, 차원 생각해야하고, 이미지 크기 가로세로 인지, RBG인지 GBR인지 잘 생각해야합니다.
실습과제
# 아래와 같이 출력하기
# 이미지 사이즈: 548*364
h, w = img_color.shape[:2]
print(f'이미지 사이즈: {w}*{h}')
# img_color가 그레이스케일 영상인지, 컬러영상인지 구분하기
# if문을 사용하여 출력
if len(img_color.shape) == 3:
print('컬러')
elif len(img_color.shape) == 2:
print('그레이스케일')
# img_color에 특정 색 정보로 영상을 변경
# 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)
cv2.imshow('img_color', img_color)
cv2.waitKey()
##creatImg.py
import cv2
import numpy as np
img1 = np.zeros((240, 320), dtype=np.uint8)
img2 = np.empty((240,320), dtype=np.uint8)
img3 = np.ones((240,320), dtype=np.uint8) * 150
img4 = np.full((240,320,3), (155,102,255),dtype=np.uint8)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)
cv2.waitKey()
zeros는 0 이니까 모두 다 검정색인것을 확인할 수 있습니다.
150의 화면은 좀 밝은 흰색을 예측할 수 있습니다.
원하는 색상으로 픽셀을 주어서 만들 수 있습니다.
이렇게 4가지 이미지 파일을 만들 수 있습니다.
#copyImg
import cv2
img = cv2.imread('../dog.bmp')
img_test = img
img[90:210, 120:240] = (255, 102, 255)
cv2.imshow('img', img)
cv2.imshow('img_test', img_test)
cv2.waitKey()
이렇게 2개 다 똑같이 뜨는 이유는
img가 가르키는건 오른쪽 그리고 img_test는 img를 가지고있는거라 같이 쓰게됩니다.
img_test = img.copy()
이렇게 copy를 해놓으면 이미지 두개는 각각 다르게 프린트 되게 됩니다.
###drawing
간단하게 라인(글자, 동그라미, 네모 선을 그리는거..)을 해보려고 합니다.
이것같은경우에는 나중에 이미지 객체 구별할때 사용하게 됩니다.
import cv2
import numpy as np
img = np.full((500, 500 ,3), 255, np.uint8)
cv2.imshow('img', img)
cv2.waitKey()
이 후에
import cv2
import numpy as np
img = np.full((500, 500 ,3), 255, np.uint8)
cv2.line(img, (70,70), (400,70), (0,0,255), 5)
cv2.imshow('img', img)
cv2.waitKey()
cv2.line 그리면 오른쪽처럼 됩니다.
import cv2
import numpy as np
img = np.full((500, 500 ,3), 255, np.uint8)
cv2.line(img, (70,70), (400,70), (0,0,255), 5)
cv2.rectangle(img, (50, 200, 150, 100), (0, 255, 0), 3)
cv2.rectangle(img, (50, 350, 150, 100), (0, 255, 0), -1)
#원 그리기
cv2.circle(img, (300, 250), 50, (255,0,0), -1)
#글씨 써보기
cv2.putText(img, 'Hello OpenCV', (300,400), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,0))
cv2.imshow('img', img)
cv2.waitKey()
-1을쓰면 칠해집니다.
# 7_camerain (카메라가 있어야함)
import cv2
import sys
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)))
print('FPS: ', cap.get(cv2.CAP_PROP_FPS))
# ret : 영상을 읽었는지 여부(True/False),
# frame : 읽어온 영상 (ndarray로 저장이되고 없다며 None으로 저장됨)
ret, frame = cap.read()
cv2.imshow('frame', frame)
cv2.waitKey()
여기서 포인트는 ret, frame입니다.
ret은 영상을 읽었는지의 여부
frame은 읽어온 영상을 의미합니다. ndarray로 저장이 되고 없다면 None으로 저장됨.
FPS 초당 얼마나 주는지를 확인할 수 있습니다.
# 반복문으로 이미지 계속 가져오기
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow('frame', frame)
if cv2.waitKey(10) == 27: #10 = /1000초 #27 = esc
break
cap.release() #카메라 영상 메모리에서 지우기
여기서 waitKey(10)의 10은 1000분의 1이라서 기다리는 시간이 없게 자연스럽게 가게 됩니다.
1000은 1초마다 갱신이 되기때문에 굉장히 느리게 됩니다
27은 키보드의 esc를 가르키게 되어서 나갈때는 27을 눌러주면 됩니다.
# 8_vedioIn (동영상 다운받아서 할 수 있음)
import cv2
import sys
cap = cv2.VideoCapture('./sea.mp4')
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)))
print('FPS: ', cap.get(cv2.CAP_PROP_FPS))
print('프레임수: ', int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))
ret, frame = cap.read()
cv2.imshow('frame', frame)
cv2.waitKey()
cap.release()
한 장면을 가져옵니다.
#영상으로 가져오기
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow('frame', frame)
if cv2.waitKey(10) == 27:
break
cap.release()
를 하게되면 영상으로 잘 됩니다.
# 9_cameraOut.py
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) #있다고 하면 파일에 1장을 저장
cv2.imshow('frame', frame) #1장 화면에 보여주기
if cv2.waitKey(10) == 27: #멈추고싶다면
break
cap.release()
out.release() #저장하고 끝냄
output.avi 로 저장이 되는것을 확인할 수 있습니다.
함수/매소드 | 설명 |
cv2.IMREAD_GRAYSCALE | 흑백으로 출력됨 |
cv2.waitkey() | 이미지가 뜨고 특정 키를 입력해야 삭제됨 써주지않으면 진짜 보지도못할정도로 빠르게 지나감 |
cv2.COLOR_BGR2RGB | BGR을 RGB의 순서로 변경해서 출력함 |
'AI 컴퓨터 비전프로젝트 > [ML,DL]머신러닝,딥러닝' 카테고리의 다른 글
[DL] ROI함수 활용하여 마우스 클릭 이벤트 구현하기 /완료 (1) | 2024.08.22 |
---|---|
[DL] 영상이어붙이기, 키이벤트, 사진 효과(add,blending...) (0) | 2024.08.09 |
[ML/DL] 포켓몬 분류해보기, 나와닮은 포켓몬 찾아보기 (2) | 2024.08.01 |
[ML/DL] 전이학습, 케글 데이터셋 활용해서 에일리언vs프레데터 예측하기 (1) | 2024.07.30 |
[DL] CNN 모델만들기,MNLIST 분류 (0) | 2024.07.28 |