OpenCV - 웹캠(USB 카메라)에서 영상 읽어오기


USB카메라에서 영상읽어 오기

간단하게 소스코드를 통해 정리해보자


<<전체소스코드:CameraWindow.py>> 

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를 제거하기 위한 함수




Posted by 휘프노스
,