opencv video to sequential images

Programming/C++

#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() 함수 호출로 해결 가능할 것 같습니다.


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



Posted by DRAGONITE

opencv2.4.9 build with Cuda 8.0

Programming/Knowledge

http://webnautes.tistory.com/1030


이 블로그를 참고해서 2.4.9 를 받고,

Cmake option 설정을 

https://askubuntu.com/questions/631720/opencv-2-4-9-make-error


와 같이 하면 됩니다. ^^

반나절 고생했네여......


여러번 시도하다가 잘 안되면 ... 깨끗하게 지우고 시작하세요

http://jasonjuang.blogspot.com/2014/08/how-to-remove-cuda-completely-for-fresh.html


와... 중간에 또 안되서 확인해보니.

8.0 을 설치하려고 하는데, 7.5 를 자동으로 찾아서. 8.0 의 위치를 지정해주어야 합니다.

https://stackoverflow.com/questions/19980412/how-to-let-cmake-find-cuda



docker multiple terminals

docker exec -it <container> bash



S,D,K,P,R,T 

https://stackoverflow.com/questions/29407474/how-to-understand-kitti-camera-calibration-files

Posted by DRAGONITE

다익스트라(Dijkstra)

Programming/Knowledge

간선에 가중치가 있는 그래프에서 1:N 최단 거리를 구하는 알고리즘입니다. 보통 가중치가 없는 그래프에서의 1:N 최단거리는 BFS(O(V+E))를 통해서 계산하고, 가중치가 있는 그래프에서 N:N 최단거리는 플로이드 워셜(O(N^3)) 으로 계산합니다. 단, 다익스트라를 포함한 위의 알고리즘은 가중치가 음수 일때는 사용하지 못합니다. 가중치가 음수일 경우 벨만포드 알고리즘이나 SPFA를 통하여 최단거리를 구해야 합니다.


최단 거리를 기록할 배열과 후부가 될 수 있는 간선 중 최고로 작은 간선을 빠르게 뽑아낼 수 있는 힙 자료구조가 필요합니다.




우선 힙은 두 가지 정보를 저장합니다. 1번 정점으로 부터의 거리와 정점의 번호입니다. 맨 처음 힙에는 0,1 이 들어갑니다. 1번 정점이 1번 정점으로부터 0만큼 떨어져 있습니다. 


pq에 삽입될 수 있는 정점이 최대 V^2이므로 log(V^2)->2*log(V) -> log(V) 번 pq에서 top을 꺼내게 됩니다. 이후 거리를 갱신하기 위해 간선을 보는데 E번 이루어지기 때문에 총 시간 복잡도는 O(Elong(V)가 됩니다.


예제 문제 백준 1753번 최단경로



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
int v, e, s, x, y, z, d[20002];
vector<vector<pair<intint>>> vt;
 
int main() {
    scanf("%d%d%d"&v, &e, &s);
    vt.resize(v + 1);
    for (int i = 0; i < e; i++) {
        scanf("%d%d%d"&x, &y, &z);
        vt[x].push_back({ y,z });
    }
    memset(d, -1sizeof(d));
    priority_queue<pair<intint>> pq;
    pq.push({ 0,s });
    while (pq.size()) {
        int here = pq.top().second;
        int cost = -pq.top().first;
        pq.pop();
        if (d[here] != -1)
            continue;
        d[here] = cost;
        for (auto it : vt[here]) {
            int next = it.first;
            int acost = -it.second - cost;
            if (d[next] != -1)
                continue;
            pq.push({ acost, next });
        }
    }
    for (int i = 1; i <= v; i++) {
        if (d[i] == -1) puts("INF");
        else printf("%d\n", d[i]);
    }
    return 0;
}
cs


Posted by DRAGONITE