DY N DY

opencv를 이용해 영상의 원하는 구간 잘라내기 본문

PARK/영상처리 관련

opencv를 이용해 영상의 원하는 구간 잘라내기

손세지 2016. 11. 22. 22:38

opencv를 이용하여 영상 부분 잘라내기


원하는 구간을 잘라낼 때 사용한다. 

opencv 3.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
#include    <iostream>
#include    <opencv/cv.hpp>
 
using namespace std;
using namespace cv;
 
#define input "input.avi"
#define output "output.avi"
#define startFrame 500
#define endFrame 1000
 
int main()
{
 
    int iCurrentFrame = 0;
 
    VideoCapture vc = VideoCapture(input);
 
    if (!vc.isOpened())
    {
        cerr << "fail to open the video" << endl;
        return EXIT_FAILURE;
    }
 
    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(output, CV_FOURCC('D''I''V''X'), fps, Size(width, height));
 
    if ((startFrame < 0 || startFrame >= vc.get(CV_CAP_PROP_FRAME_COUNT)) ||
        (endFrame < 0 || endFrame >= vc.get(CV_CAP_PROP_FRAME_COUNT)))
    {
        cerr << "wrong frame" << endl;
        return EXIT_FAILURE;
    }
    vc.set(CV_CAP_PROP_POS_FRAMES, startFrame);
    while (true)
    {
        if (iCurrentFrame > (endFrame - startFrame))
            break;
        iCurrentFrame++;
 
        Mat frame;
        vc >> frame;
        if (frame.empty())
            break;
 
        vw.write(frame);
        imshow("image", frame);
        waitKey(1);
    }
 
    vw.release();
 
    return EXIT_SUCCESS;
}
cs


다른 부분은 사실 크게 어려울 것은 없고. 

VideoCapture의 set을 이용해 원하는 프레임으로 이동하는 37라인만 알면 될 것 같다. 

get함수가 원하는 property를 가져오듯이 set함수로 원한s property를 변경가능하다. 

이를 이용해 시작 프레임을 원하는 시작프레임(9라인의 startFrame)으로 변경해주고 

원하는 만큼 VideoWrter에 Write해준 후 while loop를 종료한다.