웹카메라로 영상을 촬영 했으니 다음에 해볼 만한 내용은 촬영한 영상을 보여주면서 해당 영상을 녹화해 보도록 하자. OpenCV를 이용해서 녹화하는 방법은 아주 쉽고, 재생하는 방법도 아주 쉽다. 물론, 터미널에서만 한다면 그렇고, 이후 GUI와 함께 OpenCV를 사용한다면 간단한 재생기 등은 가볍게 만들수 있게 된다. 

     

      어쨋든, 지금 해볼 것은 OpenCV를 이용하여  웹카메라 영상을 mp4 파일로 저장하는 샘플이다. 이 샘플도 구글에 찾아보면 많은 예제 소스들을 찾아볼 수 있다. 

     

    --- 목차 ----------

    1. 라즈베리파이 4/400 OpenCV 4.6.0 설치 : https://makeutil.tistory.com/207

    2. 이미지 파일 출력 (png, jpg, bmp) : https://makeutil.tistory.com/212

    3. 웹카메라를 이용한 영상 출력 : https://makeutil.tistory.com/220 

    [현재 글] 웹카메라를 이용한 영상 저장 : https://makeutil.tistory.com/221 

    5. 웹카메라로 저장한 미디어파일(.mp4) 출력 : https://makeutil.tistory.com/222 

    --------------------

     

     

    1.  준비하기

      웹카메라를 이용하기 때문에 앞서 "3. 웹카메라를 이용한 영상출력"의 준비 사항을 확인하도록 한다. 현재 본문에서는 간단하게 설명하도록 하겠다. 

      1) 라즈베리파이에 웹 카메라 연결

      2) 카메라가 정상적으로 연결 되어있는지 확인

     

    2. 영상 녹화 소스 

      아래는 영상 녹화를 위한 소스이다. 기존 영상 출력에서 영상을 저장하기 위한 객체 선언 후 영상을 가지고 있는 객체(Mat)을 넘겨주는 것 이외에 큰 차이가 없다는 것을 확인할 수 있다. 

     

    #include <opencv2/opencv.hpp>
    #include <iostream>

    int main(int argc, char** argv) 
    {
       // 첫번째 캡쳐 장치 열기
        cv::VideoCapture cap(0); 

        // 카메라 장치가 없는 경우
        if (!cap.isOpened()) 
        {
            std::cerr << "Error: Failed to open the camera." << std::endl;
            return -1;
        }

        // 카메라 해상도 설정을 통해 저장할 이미지 크리를 지정한다.
        int frame_width = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_WIDTH));
        int frame_height = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_HEIGHT));

        
        cv::VideoWriter recorder("save.mp4",cv::VideoWriter::fourcc('X','2','6','4'),30,cv::Size(frame_width, frame_height));

        // 녹화를 위한 반복 루프
        while (true) 
        {
            cv::Mat frame;   // 이미지를 가져오기 위한 객체
            cap >> frame;   // 영상 데이터 가져오기

            // 만약 매트릭스 frame에 아무런 영상이 없는경우 루프를 종료.
            if (frame.empty()) {
                break;
            }

            // 현재 프레임을 비디오에 추가
            recorder.write(frame);         

            // 화면에 현재 프레임 표시
            cv::imshow("Recording", frame);   

            // 'q' 키를 누르면 녹화 중지
            if (cv::waitKey(1) == 'q') {
                break;
            }
        }

        
        cap.release();       // 카메라 관련 리소스 해제
        record.release();   // 저장관련 리소스 해제
        cv::destroyAllWindows();   // 프로그램 윈도우 관련 리소스 해제

        return 0;
    }

     

    3. 실행결과

      실행 결과를 확인해 보도록 하자. 

    3.1. 컴파일

      다음과 같이 입력하여 컴파일 하도록 하자. 

    $ g++ -o media_record media_record.cpp $(pkg-config opencv4 --libs --cflags)

     

     

    3.2. 실행 결과 

      실행해보면 다음과 같이 동작되는 것을 확인할 수 있다. 

     

      그리고 이미지 출력 윈도우를 클릭하고 q키를 눌러서 중단한 다음 디렉터리 내의 파일을 확인해보자. 그러면 소스코드에 입력된 save.mp4라는 파일이 생성된 것을 확인할 수 있다. 

     

    다음에는 저장된 파일을 재생하는 간단한 소스코드를 작성해서 확인해 보도록 하자.

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기