코딩 수업 기록/수화 인식 프로젝트

[수화 인식 프로젝트] 1주차 수업 _ opencv 이용하여 webcam 켜기

백복치 2021. 9. 11. 00:21

수화를 인식하여 어떤 의미를 나타내고자 하는지 알아내는 프로그램을 만들어보겠다.

 

처음엔 뭐부터 해야하는지 막막했는데 일단 하나씩 천천히 해보기로 했다.

 

opencv도 처음이고, 아이들에게 설명도 해줘야하니 좀 더 자세하게 공부해야겠다고 다짐했다.

 

일단 오늘 한거는 파이참에서 웹캠 키는 코드를 작성해보았다.

 


 

우선 파이참에서 opencv 모듈 설치가 필요하다.

 

python -m pip install opencv-python

 

영상을 가져올거니까 cv2와 time 모듈을 import 해준다.

 

그 다음 opencv를 통해서 비디오를 실행시키도록 하겠다. 

 

노트북은 0 또는 1로 webcam 포트가 열린다고 한다. 그렇다.. 구글링은 평생 숙제인것일까..

 

우리는 webcam으로 포트를 열 것이니까 0을 입력해주도록 하겠다.

 

만약 비디오 파일을 불러올 경우에는 '경로/파일명,확장자'를 입력해주자.

 

import cv2
import time

video = cv2.VideoCapture(0)  # WebCam은 0 또는 1

 

그 후 무한루프를 만들고 read()함수로 연속적인 영상의 프레임을 읽어줄 것이다.

 

import cv2
import time

video = cv2.VideoCapture(0)	# WebCam의 경우 0 또는 1

while True:
	ret, frame = video.read()	# ret = frame 읽기가 성공하면 while문의 true 값 반환, frame = 배열 형식의 영상 프레임 값을 반환

 

 

이제 본격적으로 영상을 출력할 수 있게 되었다.

 

 frame 읽기가 성공 되었을 경우에만 영상을 출력하게 만들어 주겠다.

 

import cv2
import time

video = cv2.VideoCapture(0)	# WebCam의 경우 0 또는 1

while True:
    ret, frame = video.read()
    
    # ret가 True 값을 가진다면 영상을 재생
    if ret in True : 
        cv2.imshow('VideoCapture',frame) # imshow(윈도우 창의 이름, cv2.VideoCapture()의 리턴값) 
        cv2.waitKey(1)

imshow 함수를 이용하면 영상을 출력할 수 있다.

 

일단은 웹 캠을 실행시켜 볼 것이기 때문에 videocapture의 frame 들을 출력하도록 하였다.

 

 

waitkey는 키보드의 입력을 기다리는 함수이다.

 

입력한 매개변수 ms 만큼 프로그램을 멈추고 있다가 눌린 키에 대응하는 값을 반환한다.

 

매개 변수로 넣는 입력 값은 ms 단위의 대기 시간이고, 0이면 무한 대기를 하게 된다.

 

1을 매개변수로 넣게 되면 입력과는 상관없이 1ms 마다 새롭게 갱신된다.

 

0을 넣게 되면 연속되는 영상이 나오는 것이 아니라 캡쳐된 webcam 화면이 뜨게 된다.

 

우리는 영상을 볼 것이기 때문에 1을 매개변수로 넣어 끊김없는 영상을 출력하도록 하자.

 

영상을 멈추려면 코드 실행을 중지해야 웹캠이 꺼지게 될 것이다.

 

 

거의 다 왔다!

 

마지막으로 비디오 FPS를 지정해주자.

 

FPS란 frames per second 의 약자이다.

 

FPS와 prev_time, current_time 이라는 변수를 선언해 줄 것이다.

 

current_time 은 현재 시간에서 이전 프레임 재생 시간을 비교하여 경과된 시간값을 가져오게 된다.

 

최종코드

import cv2
import time

video = cv2.VideoCapture(0)	# WebCam의 경우 0 또는 1

prev_time = 0
FPS = 100

while True:
    ret, frame = video.read()
    current_time = time.time() - prev_time # 현재 시간 - 이전 프레임 재생 시간

    # ret가 True 값을 가진다면 영상을 재생
    if (ret is True) and (current_time > 1./ FPS) :
        prev_time = time.time()
        cv2.imshow('VideoCapture', frame) # imshow(윈도우 창의 이름, cv2.VideoCapture()의 리턴값) 
        cv2.waitKey(1)

 

 

지정된 FPS의 값과 current_time를 비교하여 FPS값 이상의 시간이 경과된다면 새로운 프레임을 출력하도록 한다.

 

FPS 수가 많다는것은 비교될 프레임 수가 많고 빈번하다는 것과 같다.

 

즉, FPS 값이 클수록 영상이 더욱 자연스럽고 끊김없이 재생되는 것을 느낄 수 있다.

 

 

 

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 


 

이렇게 웹캠 불러오기 끝!