머신러닝 21일차

ParkJinYoung·2022년 11월 15일
0

Opencv

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()
profile
꾸준히

0개의 댓글