DY N DY

open cv를 이용하여 영상 잘라내기 본문

PARK/영상처리 관련

open cv를 이용하여 영상 잘라내기

손세지 2016. 9. 8. 13:23

open cv를 이용하여 영상 잘라내기 

2.4.11버전을 사용하였다. 


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
#include "opencv.hpp"
using namespace cv;
 
int main()
{
    const string path = "C:/xxx/xxxx.../input.avi";
    VideoCapture videoCapture(path);
 
    if (!videoCapture.isOpened())
        return EXIT_FAILURE;
 
    double fps = videoCapture.get(CV_CAP_PROP_FPS);
    int width = (int)videoCapture.get(CV_CAP_PROP_FRAME_WIDTH);
    int height = (int)videoCapture.get(CV_CAP_PROP_FRAME_HEIGHT);
    height -= 30;
    Rect rect(00, width, height);
    VideoWriter vw;
    vw = VideoWriter("C:/xxx/xxxx.../output.avi", CV_FOURCC('D''I''V''X'), fps, Size(width, height));
    while (1)
    {
        Mat videoFrame;
        videoCapture >> videoFrame;
        if (videoFrame.empty()){
            vw.release();
            return EXIT_SUCCESS;
        }
        Mat imageTo = videoFrame(rect);
        vw.write(imageTo);
        imshow("test", imageTo);
        waitKey(1);
    }
}    
cs


open cv를 이용하여 영상의 일부분을 잘라내고 영상으로 저장하는 코드. 

영상을 videocapture로 받아와서 너비와 높이를 알아낸다. (VideoCapture의 get은 double을 반환하기 때문에 int로 형변환해준다.)

원하는 만큼 자른다. (여기에서는 하단을 30픽셀만큼 잘라냈다.)


좌우를 자르고 싶다면 0, 0, width, height에서 첫번째와 세번째를 조절하면 되고, 상하를 자르고 싶다면 두번째와 네번째를 조절하면 된다. 

이때 조절한 범위와 vw의 파라미터 중 마지막에 들어가는 cv::Size가 맞아야 한다. 


VideoWiter는 말 그대로 영상을 저장해주기 위해 사용한다. 

초기화 할 때 저장할 path, 저장할 데이터 포맷 정보, 영상의 총 fps, 영상의 사이즈. (추가로 컬러, 흑백 정보까지)를 넣어준다. 

1
CV_WRAP VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);
cs

이때 fourcc에 0을 넣어주면 압축이 되지 않고 저장되며 -1을 넣어주면 현재 컴퓨터에 설치된 코덱 중 하나를 선택할 수 있다. 

여기서는 직접 넣어는 방법을 사용하였다. 

1
2
3
4
5
#define CV_FOURCC_MACRO(c1, c2, c3, c4) (((c1) & 255+ (((c2) & 255<< 8+ (((c3) & 255<< 16+ (((c4) & 255<< 24))
CV_INLINE int CV_FOURCC(char c1, char c2, char c3, char c4)
{
    return CV_FOURCC_MACRO(c1, c2, c3, c4);
}
cs

CV_FOURCC('D', 'I', 'V', 'X')는 MPEG4를 의미한다. 


실제로 영상을 받아서 저장하는 부분은 while문 내에 있다. 

while문에서 

videoFrame을 vedioCaptue에서 한 frame씩 받아와서 

imageTo에 크기를 조절해서 넣어준 후에 

생성한 vw에 write함수를 이용해 넣어준다. 

imshow, waitKey는 실제 영상을 확인하기 위해 넣었다. 


더이상 frame이 없다면 반드시 vw release를 해준 후에 종료한다.