opencv관련 라이브러리, numpy, pandas, matplotlib
#이미지 로딩
import cv2
img = cv2.imread("data/img.jpg")
cv2.imshow('img',img) # 띄워질 창의이름, 사용이미지
cv2.waitKey(1000) # 닫는 기능, 1000ms = 1초
# 시간내에 아무 버튼을 누르면 종료
cv2.destroyAllWindows() # 실행이 되면 윈도우창 종료
def end(ms=0): # ms 기본값 0
cv2.waitKey(ms)
cv2.destroyAllWindows()
import cv2
img = cv2.imread("data/img.jpg")
cv2.imshow('img',img) # 띄워질 창의이름, 사용이미지
end()
## 색상 공간을 변환
- RGB, HSV, Gray, BGR, RGBA
import cv2
img=cv2.imread('data/img.jpg') # RGB로 불러온다
# 색상공간을 변환
img_cvt =cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow('Gray',img_cvt)
end()
import matplotlib.pyplot as plt
# matplotlib은 기본 색상 체계가 BGR
plt.imshow(img_cvt)
## 이진이미지 만들기
- 픽셀값이 0, 255만 존재
- 흑백사진이기 때문에 GrayScale로 받아옴
import cv2
img = cv2.imread('data/img.jpg',cv2.IMREAD_GRAYSCALE)
# 이미지, 문턱값, 문턱값 초과시 변환값, 이진이미지 속성
# 127미만은 0, 나머지값은 255, THRESH_BINARY_INV : 흰색과 검은색 반대로 표현
ret, thr1 =cv2.threshold(img, 127,255,cv2.THRESH_BINARY)
print(ret)
cv2.imshow('gray',thr1)
end(1000)
## 동영상 출력하기
- 동영상 출력하기
- 캡쳐하기
- 녹화하기
import cv2
cap=cv2.VideoCapture('data/video.mp4')
while True:
# 동영상에서 이미지 한장씩 읽어오기
# ret = 사진 가져오면 True, 못가져오면 False
# frame = 이미지 1장
ret, frame= cap.read()
if not ret: # ret이 False일때 동작
print('이미지를 불러오지 못했습니다')
cap.release() # 비디오 객체 종료
cv2.destroyAllWindows()
break
#이미지 출력
cv2.imshow('video',frame)
cv2.waitKey(33) # 1장의 사진을 33ms만큼만 보여줘
# 1000ms = 1초
# 1초에 약 30장의 이미지 출력
# 일반적인 동영상 초당 30장의 이미지를 출력
import cv2
cap=cv2.VideoCapture('data/video.mp4')
count = 0 # 파일 이름 인덱스 용
# 비디오 객체 생성
fps = 30 # 초당 30장의 이미지 저장
w = int(cap.get(3)) # 이미지의 가로크기
h = int(cap.get(4)) # 이미지의 세로크기
fcc = cv2.VideoWriter_fourcc(*"MPEG") # mp4용 코덱
# *"DIVX" = avi용 코덱
out =cv2.VideoWriter("data/cap_video.mp4",fcc,fps,(w,h))
#out 객체에 사진을 계속 넣어주면 동영상 완성
#녹화여부 => 연속적으로 저장하기위해
record = False
while True:
ret, frame= cap.read()
if not ret:
print('이미지를 불러오지 못했습니다')
cap.release()
cv2.destroyAllWindows()
break
cv2.imshow('video',frame)
if record:
out.write(frame)
# 종료 기능
# k변수에는 키보드로 입력한 값이 저장
k=cv2.waitKey(8)
if k==49: #ASC코드로 1을 의미
print('종료합니다.')
cap.release()
out.release()
cv2.destroyAllWindows()
break
# 캡쳐 기능
if k==50:
print(f'data/cap{count}.jpg사진을 저장합니다.')
cv2.imwrite(f'data/cap{count}.jpg',frame,
params=[cv2.IMWRITE_JPEG_PROGRESSIVE, 0]) # 파일만들기
count += 1
# 녹화 기능 시작&종료만들기
if k==51:
# 녹화시작
print('녹화시작')
record = True
if k==52:
# 녹화종료
print('녹화종료')
record = False
out.release() # out 객체 종료
from glob import glob
glob('data/cap*.jpg')
## 캡쳐 사진으로 동영상 만들기
import cv2
fps = 5 # 초당 5장의 이미지 저장
w = 640 # 이미지의 가로크기
h = 358 # 이미지의 세로크기
fcc = cv2.VideoWriter_fourcc(*"MPEG") # mp4용 코덱
# *"DIVX" = avi용 코덱
out =cv2.VideoWriter("data/movie.mp4",fcc,fps,(w,h))
#캡쳐된 파일을 한장씩 가져와서 동영상을 만든다
for i in range(26):
# 이미지 읽기
img = cv2.imread(f'data/cap{i}.jpg')
out.write(img) # out객체에 하나씩 넣기
out.release() # 닫아주기
픽셀 기반 처리 : 픽셀 하나하나를 가지고처리, 인접픽셀간 관계확인가능=>전체적 이미지분석힘듬, 속도가 느림
블록 기반 처리 : 픽셀의 묶음, 전체적인 이미지를 분석, 속도가 빠름
주파수 기반 처리 : 주파수는 픽셀값의 변화를 뜻한다.이미지에는 저주파 영역이 많음, 이미지의 특성은 고주파 영역에 많음, 저주파(픽셀값이 작게 변하는 부분), 고주파(픽셀값이 긐게 변하는 부분)
import cv2
img = cv2.imread('data/img.jpg')
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def end(ms=0):
cv2.waitKey(ms)
cv2.destroyAllWindows()
img.shape
#세로, 가로, RGB✔✔✔
img[405,645] = [0,0,0]
cv2.imshow('img',img)
end()
import cv2
img = cv2.imread('data/balloon.jpg')
cv2.imshow('balloon',img)
end()
#이미지 자르기
import cv2
img = cv2.imread('data/img.jpg')
cv2.imshow('img',img)
end()
# x,y좌표
#좌상단 307 263, 우하단 601 324
# roi = Region of Image
roi = img[263:324,307:601]
cv2.imshow('roi',roi)
end()
# roi를 원래 이미지에 표시
# cv2.rectangle = 이미지에 사각형 그리기
# cv2.putText = 이미지에 글씨쓰기
img=cv2.imread('data/img.jpg')
# 사용할 이미지, 좌상단 좌표, 우하단 좌표
roi_img = cv2.rectangle(img, (307,263),(601,324),(255,0,0),3)
# 사용할 이미지,출력 할내용, 출력좌표, 폰트, 글씨크기, 색상, 선두께
roi_img = cv2.putText(roi_img,"glasses",(601,263)
,cv2.FONT_HERSHEY_PLAIN,4,(0,0,255),3
)
cv2.imshow('roi_img',roi_img)
end()
# 이미지 필터링 - 모자이크
import cv2
import numpy as np
img = cv2.imread('data/img.jpg')
kernel =np.ones((10,10),np.float) / 100
blur = cv2.filter2D(img,-1,kernel)
cv2.imshow('blur',blur)
end()
# 침식과 팽창
- 검정배경에 흰색 물체에 사용하는 방법
- erosion(침식) : 이미지의 경계 부분을 배경 픽셀로 변경하는 작업
- 흰색이 검은색으로 변경
- 물체의 테두리가 작아짐
- dilation(팽창) : 이미지의 배경부분을 경계 픽셀로 변경하는 작업
- 검은색이 흰생으로 변경
- 물체의 테두리가 커짐
import cv2
import numpy as np
img=cv2.imread('data/number.png',cv2.IMREAD_GRAYSCALE)
kernel = np.ones((3,3),np.float32)
erosion = cv2.erode(img,kernel, iterations =1 )
dilation = cv2.dilate(img,kernel, iterations =1 )
cv2.imshow('original',img)
cv2.imshow('erosion',erosion)
cv2.imshow('dilation',dilation)
end()
# Opening과 Closing
- Opening : 침식후에 팽창을 수행하는것, 배경에 노이즈가 있을때
- Closing : 팽창후에 침식을 수핵하는것, 물체에 노이즈가 있을때
import numpy as np
import cv2
imgA = cv2.imread('data/noise_A.png',cv2.IMREAD_GRAYSCALE)
imgB = cv2.imread('data/noise_B.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('A',imgA)
cv2.imshow('B',imgB)
kernel = np.ones((3,3),np.float32)
opening = cv2.morphologyEx(imgA, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(imgB, cv2.MORPH_CLOSE, kernel)
cv2.imshow('opening',opening)
cv2.imshow('closing',closing)
end()
# Edge 엣지 추출기
import cv2
img =cv2.imread('data/img.jpg',cv2.IMREAD_GRAYSCALE)
# 이미지, 최소값, 최대값
# 값의 범위가 클수록 적은 테두리가 나옴
edge = cv2.Canny(img,50,200)
# 색상 반전
edge2 = cv2.bitwise_not(edge)
cv2.imshow('edge',edge)
cv2.imshow('edge2',edge2)
end()