AI 머신러닝 딥러닝/Open CV 프로그래밍 공부일지

Open CV 기초 공부 일지 1. Open CV 표현방법 (2)

Tomitom 2023. 1. 11. 17:49
반응형

Grayscale 이미지로 출력

cvtColor 함수를 이용하여 그레이 스케일 영상으로 변경할 수 있습니다. 

 

import cv2
from matplotlib import pyplot as plt

imageFile = './data/lena.jpg'
imgGray = cv2.imread(imageFile, cv2.IMREAD_GRAYSCALE)
plt.axis('off')

plt.imshow(imgGray, cmap ="gray", interpolation = 'bicubic') 
# 보간(빈곳을 채운다) 
plt.show()

 

 

interpolation 설정값은 보간 입니다. 

 

이미지 보간법(interpolation)

영상 변환 작업 시 아무런 정보를 받지 못하는 화소를 홀(hole) 이라고 부릅니다. 이러한 홀을 유도하는 작업을 보간이라고 합니다. 아래에는 matplotlib 공식 홈페이지에서 제공하는 보간법 예제입니다.

 

import matplotlib.pyplot as plt
import numpy as np

methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16',
           'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric',
           'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']

# Fixing random state for reproducibility
np.random.seed(19680801)

grid = np.random.rand(4, 4)    # 4행 4열의 색상 배열을 랜덤하게 하기 위한 것 

fig, axs = plt.subplots(nrows=3, ncols=6, figsize=(9, 6),
                        subplot_kw={'xticks': [], 'yticks': []})

for ax, interp_method in zip(axs.flat, methods):
    ax.imshow(grid, interpolation=interp_method, cmap='viridis')
    ax.set_title(str(interp_method))

plt.tight_layout()
plt.show()

 

 

모자이크처럼 정보가 없는 픽셀의 홀값을 채운 것을 알 수 있습니다. 

 

 

여백 조정하여 영상 저장 

plt.figure 으로 크기를 6인치, 6인치로 설정합니다. 

plt.subplots_adjust(left=0, right = 1, bottom = 0, top = 1) 에서는 영상 출력 범위를

좌우 0,1 위아래 0,1 로 조정합니다. 범위는 left < right 와 bottom < top 이어야 합니다. 

 

plt.axix('off') 는 x축과 y축을 지우는 것입니다. 

 

 

 

plt.savefig('./data/0205.png') 으로 현재 figue 의 화면을 저장합니다. 

 

import cv2
from matplotlib import pyplot as plt
imageFile = './data/lena.jpg'
imgGray = cv2.imread(imageFile, cv2.IMREAD_GRAYSCALE)

plt.figure(figsize = (6, 6))

plt.subplots_adjust(left=0, right = 1, bottom = 0, top = 1)
plt.imshow(imgGray, cmap = 'gray')

plt.axis('off')
plt.savefig('./data/0205.png')
plt.show()

 

 

서브플롯을 생성하여 출력

 

각각의 data 폴더 안에 이미지를 넣어놓고 그것을 2행 2열의 서브플롯을 생성하여 배열하겠습니다. 

 

 

import cv2
from matplotlib import pyplot as plt

path = './data/'
imgBGR1 = cv2.imread(path +'lena.jpg')
imgBGR2 = cv2.imread(path+'apple.jpg')
imgBGR3 = cv2.imread(path+'baboon.jpg')
imgBGR4 = cv2.imread(path+'orange.jpg')

# 컬러 변환 : BGR -> RGB
imgRGB1 = cv2.cvtColor(imgBGR1, cv2.COLOR_BGR2RGB)
imgRGB2 = cv2.cvtColor(imgBGR2, cv2.COLOR_BGR2RGB)
imgRGB3 = cv2.cvtColor(imgBGR3, cv2.COLOR_BGR2RGB)
imgRGB4 = cv2.cvtColor(imgBGR4, cv2.COLOR_BGR2RGB)

# 2행 2열의 서브 플롯을 생성 
fig, ax = plt.subplots(2, 2, figsize = (10, 10), sharey = True)
# sharey 파라미터를 사용하면 두 그래프의 축을 공유할 수 있기 때문에 범위와 눈금이 동일하게 표시

fig.canvas.manager.set_window_title('Sample Pictures')

ax[0][0].axis('off')
ax[0][0].imshow(imgRGB1, aspect='auto')

ax[0][1].axis('off')
ax[0][1].imshow(imgRGB2, aspect='auto')

ax[1][0].axis('off')
ax[1][0].imshow(imgRGB3, aspect='auto')

ax[1][1].axis('off')
ax[1][1].imshow(imgRGB4, aspect='auto')

plt.subplots_adjust(left = 0, bottom = 0, 
                   right = 1, top = 1, 
                   wspace=0.05, hspace = 0.05)

plt.savefig("./data/0206.png", bbox_inches='tight')  # 여백을 없애기 위함 
plt.show()

 

 

카메라 캠 기능을 이용하여 출력

 

연결된 카메라로부터 비디오 프레임을 캡쳐하고 표시하는 기능입니다. 

이 경우 카메라가 연결되지 않은 경우에는 '카메라가 연결되어 있지 않다'는 문구를 출력하겠습니다. 

 

VideoCapture() 로 카메라를 개방하고, while 문에 의한 반복문으로 VideoCapture.read() 함수를 사용하여 

프레임을 빠르게 한 장씩 캡처하여 영상 프레임을 처리하고, 윈도후 화면에 표시합니다. 

반복문 내에서 비디오 프레임을 얻을 수 없거나, 키보드 (esc등) 에 의한 중단 요청이 있는 경우 반복문을 탈출하여 종료할 수 있도록 합니다. 

 

import cv2

cap = cv2.VideoCapture(0)  # 카메라가 여러대 있을 때를 고려하여 식별자 숫자를 적는다 0번부터.  
if cap.isOpened():
    print("ok")
    delay = int(1000/cap.get(cv2.CAP_PROP_FPS))
    # CAP_PROP_FPS : 초당 프레임 분의 1000 초당 프레임을 시간으로 변환하기 위한 것 
    
    while True : # 읽어오면 True, 못 읽어오면 False
        ret, img = cap.read()  #불리언 넘배열
        if ret : 
            
            
            ## 이 부분에 원하는 영상처리 관련 로직을 추가하면 됩니다. 
            
            
            img_gray = cv2. cvtColor(img, cv2.COLOR_BGR2GRAY) # 회색조로 변경 
            cv2.imshow("Movie", img_gray)
            if cv2.waitKey(delay) & 0xFF ==27 :   
                # 키보드만의 아스키 코드 값에서 27은 esc 키를 의미합니다. 
                # esc 키가 입력되지 않으면 계속 시간마다 프레임을 읽어들이다가 입력되면 멈춤.
                break
                
            else : 
                printf("프레임을 읽어오지 못했습니다.")
                break
                
else : 
    print("카메라가 연결되어 있지 않습니다.")
cap.release(); cv2.destroyAllWindows();

 

여기서 주의할 것 ! 

pafy 코드의 내부 문제로 실행이 되지 않고 오류가 날 수 있습니다. 

여기서 오류를 고치는 방법은 pafy 패키지 내부 backend_youtube_dl.py 모듈의 53, 54번 라인을 다음과 같이 수정하는 것입니다. 

self._likes = self._ydl_info.get('like_count',0)
self._dislikes = self._ydl_info.get('dislike_count',0)

 

 

 

 

현재 사용하고 있는 컴퓨터에는 카메라가 없으므로 카메라가 연결되어 있지 않다는 문구가 출력됩니다. 

 

유튜브 영상 정보 출력

 

Canny Edge 엣지란  영상이 움직이는 실루엣입니다. 컴퓨터 상에서 영상으로는 우리처럼 시각적으로 바로 사물과 사물 등의 경계를 구분할 수 없으므로 서로간을 구별하기 위해 엣지를 구분해줍니다. 

그렇게 경계 실루엣을 구별하는 것 중에 하나가 Canny Edge 입니다. 

 

# 비디오 입력과 화면 표시 

import cv2
import pafy # 유튜브 영상 정보를 얻을 수 있는 패키지
url = 'https://www.youtube.com/watch?v=u_Q7Dkl7AIk'
video = pafy.new(url)

print('title= ', video.title)
print('video.rating= ', video.rating)
print('video.duration= ', video.duration)

best = video.getbest()     #video.getbest(preftype = 'mp4')

print('best.resolution', best.resolution)

cap = cv2.VideoCapture(best.url)

while(True):
    retval, frame = cap.read()   # retval = 리턴
    if not retval :   # true 가 아닐 경우 브레이크 
        break
    cv2. imshow('frame', frame)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 100, 200)  # Canny Edge 엣지. 영상이 움직이는 실루엣.
    
    cv2.imshow('edges',edges)
    key = cv2.waitKey(25)
    if key == 27 :
        break    
cv2.destroyAllWindows()

 

 

 

 

만약 영상이 꺼지지 않을 때에는 esc 를 눌러서 닫아주세요! 

 

 

반응형