dev-logs

Mat 비교해서 동영상 프레임 보정하기 본문

공부/OpenCV

Mat 비교해서 동영상 프레임 보정하기

두룹두두 2018. 6. 14. 19:18

내가 영상처리를 한 결과를 직접 캡쳐한 동영상으로 보다보면, 프레임이 끊기는 경우가 있었다. (영상처리 실력이 아직 부족해서 그렇다...)


프레임이 끊기는 경우란?

1프레임 영상처리에 걸리는 시간이 지연되면 영상이 느려진다. 

실행결과를 팟플레이어나 반디캠같은 캡쳐도구로 캡쳐하다보면 이를 고려하지 않기 때문에 프레임이 끊긴다고 느껴진다.


물론 실행결과를 코드상에서 그대로 저장하면 문제 없을것이다!


오늘은 프레임 끊기는 동영상을 보정해달라고 요청을 받아서 간단하게 만들었다. 


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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include "opencv2\highgui.hpp"
#include "opencv2\world.hpp"
 
 
using namespace cv;
using namespace std;
 
static Mat frameMemory; //이전 프레임 저장할 변수
 
bool isDelayedFrame(Mat frame){
    if (frameMemory.empty() || frame.empty()){
        cout << "is empty" << endl;
        return false;
    }
    Mat diff;
    
    bool ident = !norm(frame, frameMemory, NORM_L1); //L1 정규화.(절대값으로 비교)
    return ident;
}
 
int main(){
    VideoCapture vc;
    vc.open("src.mp4");
    int frameCnt = 0;
 
    if (!vc.isOpened()){
        cout << "can't open File" << endl;
        return 0;
    }
    double fps = vc.get(CV_CAP_PROP_FPS);
    int width = (int)vc.get(CV_CAP_PROP_FRAME_WIDTH);
    int height = (int)vc.get(CV_CAP_PROP_FRAME_HEIGHT);
 
 
    VideoWriter vw;
    vw = VideoWriter("result.avi", CV_FOURCC('D''I''V''X'), 30, Size(width, height), true);//avi로 저장. mp4로 하면 에러남..
 
    while (1)
    {
        Mat frame;
        vc >> frame;
        if (frame.empty()){
            vw.release();
            cout << "done" << endl;
            return 0;
        }
        //일치하는 프레임인지 검사        
        if (frameCnt > 0){
            if (!isDelayedFrame(frame)){
                vw << frame;
            }
        }
        frameMemory = frame;
 
        frameCnt++;
 
    }
}
cs


'공부 > OpenCV' 카테고리의 다른 글

mat 사용방법  (0) 2017.12.05
동영상을 일정시간으로 분할하기  (0) 2017.12.04
Comments