OpenCV - 웹캠(USB 카메라)에서 영상 읽어오기
USB카메라에서 영상읽어 오기
간단하게 소스코드를 통해 정리해보자
<<전체소스코드:CameraWindow.py>>
import cv2
import time
clicked = False
iscapture = False
def onMouse(event, x, y, flags, param):
global clicked
global iscapture
if event == cv2.cv.CV_EVENT_RBUTTONUP:
clicked = True
elif event == cv2.cv.CV_EVENT_LBUTTONUP:
iscapture = True
#print 'capture OK!!'
cameraCapture = cv2.VideoCapture(0)
# camera resolution setting
#cameraCapture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 2048)
#cameraCapture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 1536)
cameraCapture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 640)
cameraCapture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 480)
cv2.namedWindow('KnVision Window')
cv2.setMouseCallback('KnVision Window', onMouse)
fps = 10 # an assumption
size = (int(cameraCapture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), int(cameraCapture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
print 'fps :', fps, ' size : ', size
videoWriter = cv2.VideoWriter('MyOutputVid.avi', cv2.cv.CV_FOURCC('I','4','2','0'), fps, size)
#videoWriter = cv2.VideoWriter('MyOutputVid_mjpg.avi', cv2.cv.CV_FOURCC('M','J','P','G'), fps, size)
#videoWriter = cv2.VideoWriter('MyOutputVid.flv', cv2.cv.CV_FOURCC('F','L','V','1'), fps, size)
print 'Showing camera feed. Click window or press any key to stop.'
success, frame = cameraCapture.read()
print 'Capture Start!!'
print frame
while success and cv2.waitKey(1) == -1 and not clicked:
if iscapture == True :
tsec = time.time()
tname = time.strftime("%Y-%m-%dT%Hh%Mm%Ss", time.gmtime(tsec))
print 'capture tiem : ', tname
fname = tname + ".jpg"
cv2.imwrite(fname, frame)
iscapture = False
cv2.imshow('KnVision Window', frame)
videoWriter.write(frame)
success, frame = cameraCapture.read()
cv2.destroyWindow('KnVision Window')
각각의 코드를 나누어 설명하면 다음과 같다.
import cv2
import time
OpenCV 라이브러리와 time 라이브러리를 임포트(포함) 시키는 문장
clicked = False
iscapture = False
전역변수 선언
(clicked : 마우스 클릭여부 확인, iscapture : 캡쳐 요청 확인)
def onMouse(event, x, y, flags, param):
global clicked
global iscapture
if event == cv2.cv.CV_EVENT_RBUTTONUP:
clicked = True
elif event == cv2.cv.CV_EVENT_LBUTTONUP:
iscapture = True
마우스 동작에 대한 이벤트핸들러 정의
파이썬에서는 전역변수로 값을 넘기기 위해서는 함수에서
global 지시어를 사용해서 전역변수임을 확인시켜야한다.
마우스 버튼을 눌렀다가 놓았을때 동작하도록 이벤트 지정
cv2.cv.CV_EVENT_RBUTTONUP : 마우스 오른쪽 버튼 업(띰)
cv2.cv.CV_EVENT_LBUTTONUP : 마우스 왼쪽 버튼 업(띰)
핸들러 등록은 아래의 코드에서 다시 설명하도록 하자
cameraCapture = cv2.VideoCapture(0)
실제 카메라를 오픈하여 연결하는 함수
http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-open
에서 좀더 자세한 설명을 참조할 수 있다.
간단하게 설명하면
0번 장치로 등록된 카메라를 선택하게 한 명령이며
여기서 0번 카메라는 내 노트북에 달려있는 웹캠에 해당한다.
즉 노트북 카메라 외에 별도의 USB카메라가 있다면 0번 다음에 해당하는 1번 2번과 같은 순서로 지정하면된다.
cameraCapture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 640)
cameraCapture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 480)
VideoCapture 로 넘겨받은 객체에 해상도를 설정하는 부분으로
실제 카메라가 지원하는 해상도를 확인해서 지정하면 된다.
따로 지정하지 않으면 기본해상도를 지원한다.
cv2.namedWindow('KnVision Window'')
cv2.setMouseCallback('KnVision Window'', onMouse)
OpenCV에서 만들어주는 윈도우 창을 생성한다.
'KnVision Window'라고 지정한 이름으로 이후에 출력되는 영상을 표출한다.
setMouseCallback 함수를 이용해서 미리 만들어 둔 마우스이벤트핸들러(onMouse)를 등록한다.
videoWriter = cv2.VideoWriter('MyOutputVid.avi', cv2.cv.CV_FOURCC('I','4','2','0'), fps, size)
#videoWriter = cv2.VideoWriter('MyOutputVid_mjpg.avi', cv2.cv.CV_FOURCC('M','J','P','G'), fps, size)
#videoWriter = cv2.VideoWriter('MyOutputVid.flv', cv2.cv.CV_FOURCC('F','L','V','1'), fps, size)
동영상을 저장하기 위해 VideoWriter를 통해 출력을 위한 객체를 생성한다.
http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=videowriter#cv2.VideoWriter
FOURCC codec 설정은 아래 링크 참조
http://www.fourcc.org/codecs.php
문서상으로 raw 외에도 mjpg 등으로 저장하는 것을 지원한다고 되어 있는데
이번 코드에서는 raw 형태 동영상만 성공했다.
success, frame = cameraCapture.read()
VideoCapture 객체를 통해 영상을 읽어온다.
성공여부와 이미지를 리턴값으로 돌려준다.
while success and cv2.waitKey(1) == -1 and not clicked:
if iscapture == True :
tsec = time.time()
tname = time.strftime("%Y-%m-%dT%Hh%Mm%Ss", time.gmtime(tsec))
print 'capture tiem : ', tname
fname = tname + ".jpg"
cv2.imwrite(fname, frame)
iscapture = False
cv2.imshow('KnVision Window', frame)
videoWriter.write(frame)
success, frame = cameraCapture.read()
이미지 읽기가 정상으로 리턴되면
반복문을 통해 영상을 읽어서
imshow 함수를 이용해 namedWindow 함수로 생성한 윈도우에 영상을 보이도록 한다.
코드 실행중 보이는 모든 영상은 동영상으로 저장하고
마우스 좌측 버튼을 클릭하게 되면
if iscapture == True:
루틴을 수행하여
영상을 캡쳐한 시간으로된 화일명으로 정지영상을 저장하도록 하였다.
cv2.destroyWindow('KnVision Window')
프로그램 종료 시 생성한 namedWindow를 제거하기 위한 함수
'ComputerVision' 카테고리의 다른 글
Python에서 OpenCV 사용하기 (0) | 2015.08.01 |
---|---|
C# 에서 OpenCV 사용하기 (0) | 2015.07.24 |
EmguCV, OpenCVSharp 카메라 캡쳐 코드 비교 (0) | 2015.07.24 |
OpecnCV RTSP(IP Camera) 영상 읽어오기 with C++ (2) | 2015.07.09 |
scipy, matplotlib 실행시 에러 (0) | 2015.06.05 |