2014년 4월 21일 월요일

OpenCV에서 비디오 파일 읽기

스마트폰에서 촬영한 비디오 파일을 OpenCV에서 읽어 처리하려고 하는 도중 알게 된 살짝 어이없는 사실..

Video I/O API


OpenCV에서 비디오 파일을 처리하기 위해서는 cv::VideoCapture 클래스를 이용한다. 관련 예제들을 참고하면 이런 식이다.

#include "opencv2/opencv.hpp"
namespace cv;

VideoCapture vc;
if ( !vc.open( "path_to_video_file" ) )
    return -1;
namedWindow( "video" );
while (1)
{
    Mat frame;
    vc >> frame;
    imshow( "video", frame );
    if ( waitKey( 30 ) > = 0 ) break;
}

opencv_ffmpeg


위의 코드를 실행해보면 거의 비디오 파일을 열지 못한다. (아주 기초적인 codec만 가능한 것 같음). 이것은 OpenCV에서 AV codec 라이브러리로 사용하는 ffmpeg에 연결되지 못하기 때문인데 해결 방법은 역시 아주 간단하다. (32bit 환경 기준)

  1. OpenCV/3rdparty/ffmpeg 디렉터리에 있는 opencv_ffmpeg.dll 파일을 기존 opencv dll 파일이 있는 디렉터리에 복사한다. (또는 OpenCV/3rdparty/ffmpeg 디렉터리를 path로 지정한다)
  2. 자신이 사용하고 있는 OpenCV 버전을 이용하여 dll 파일명 뒤에 숫자를 붙인다. 예를 들어 OpenCV 2.4.6을 사용하고 있는 경우 opencv_ffmpeg246.dll로 파일명을 바꾸어 준다.