본문 바로가기
Programming/C++

opencv video to sequential images

by OKOK 2018. 6. 1.

#include "opencv2/opencv.hpp"

using namespace cv;


int main(int, char**)

{

    VideoCapture cap(0); // open the default camera

    //VideoCapture cap("chaplin.mp4");

    if (!cap.isOpened())  // check if we succeeded

        return -1;


    Ptr<BackgroundSubtractor> pMOG = new BackgroundSubtractorMOG2();


    Mat fg_mask;

    Mat frame;

    int count = -1;


    for (;;)

    {

        // Get frame

        cap >> frame; // get a new frame from camera


        // Update counter

        ++count;


        // Background subtraction

        pMOG->operator()(frame, fg_mask);


        imshow("frame", frame);

        imshow("fg_mask", fg_mask);


        // Save foreground mask

        string name = "mask_" + std::to_string(count) + ".png";

        imwrite("C:\\Users\\21000\\재밌는거\\mp4toPng\\test" + name, fg_mask);


        if (waitKey(1) >= 0) break;

    }

    // the camera will be deinitialized automatically in VideoCapture destructor

    return 0;



Video capture

https://www.learnopencv.com/read-write-and-display-a-video-using-opencv-cpp-python/


basic code

https://stackoverflow.com/questions/33503138/how-to-extract-video-frames-and-save-them-as-images-using-c


 https://github.com/raulmur/ORB_SLAM2 에 Mono 카메라에 대해 3가지 방법이 제시되어 있습니다. 이 중 TUM 과 EuRoC는 Depth 정보를 필요로 합니다. 따라서 mono_kitti 코드를 사용하기로 결정하였습니다. 

mono_kitti 코드의 인풋 형태는

./Examples/Monocular/mono_kitti Vocabulary/ORBvoc.txt Examples/Monocular/KITTIX.yaml PATH_TO_DATASET_FOLDER/dataset/sequences/SEQUENCE_NUMBER

입니다. 여기서 fx, fy, cx, cy 뿐만 아니라 S, D, K, R, T vector 정보를 필요로 합니다. 그리고 동영상 파일이 아닌 sequence images를 인풋으로 받습니다.

(참고 S, D, K, R, T vector: https://stackoverflow.com/questions/29407474/how-to-understand-kitti-camera-calibration-files)


먼저 svnet 과 통합 이전 orb_slam 테스트 영상은 shared/User/SaesaemLee/SLAM 에 올려두었습니다. 결과부터 말씀드리면, shared/Dataset/실차_수집동영상/Sanjose 영상의 경우 맵을 만들어 내지 못합니다. 그 이유로는 S, D, K, R, T 의 부정확한 값을 넣었기 때문이라 예상되고, 2차적으로는 카메라 좌우에 벽이나 물체가 지속적으로 잡혀야 하는데 그렇지 못한 경우 맵을 만들어 내지 못합니다. (00_KITTI 영상과 다른 영상을 비교해보시면 쉽게 이해하실 수 있습니다.)  


실제 수집 영상이 아닌 KITTI 에서 제공되는 영상의 크기는 1241*376입니다. 실차 영상 1280*720 크기의 경우 FPS가 2배 정도 떨어지는 것을 확인 할 수 있습니다. 1280*720 input 시 10fps 이하의 속도가 나오는 것 같습니다..  


현재 통합 작업 중 해결해야 하는 이슈는 다음과 같습니다.

(orb_slam_svnet-2018-06-02_05.44.29 현재까지 진행 영상)

1. mono_kitti 의 orb_slam의 경우 그레이스케일 이미지를 활용하는데, svnet 이 그레이에서도 작동가능한지 확인해야 합니다.

2. svnet bounding 의 싱크가 맞지 않습니다. -> svnet 과 slam 이 하나의 이미지에 대해 적용되는 시간 차 떄문인 것 같습니다.

3. 메모리 누수가 발생합니다. (an illegal memory access was encountered) -> 적절한 위치에서 svnet_release() 함수 호출로 해결 가능할 것 같습니다.


문제점을 해결하여 추가 작업 후 또 메시지 남겨두도록 하겠습니다. 궁금하신 사항 남겨 주시면 답장 드리도록 하겠습니다..