해당 포스팅은 OpenCV 4로 배우는 컴퓨터 비전과 머신러닝 (황선규 저)를 보고 공부하며 개인적인 용도를 위해 정리한 글이다.
Video Capture
- 영상 파일을 불러오거나 장치에 연결 되어있는 카메라에서 이미지 (프레임) 을 받아옴
- 영상 파일을 불러올 때엔
cv::VideoCapture cap("./path/to/file");
을 - 장치에 연결 된 카메라에서 프레임을 불러올 때에는
cv::VideoCapture cap(0);
을 입력한다.0
은 장치에 연결 된 0번째 카메라라는 의미이며, 연결 된 장치가 늘어날 수록index
도 늘어난다.
cv::VideoCapture
클래스를 초기화하기 위한 방법은 두 가지.- 선언과 동시에 초기화
- 선언만 한 뒤
.open()
함수로 초기화
.isOpend()
함수로 현재 영상이나 카메라가 열려있는지 확인 가능.read(frame)
함수로 미리 설정 된frame
이란cv::Mat
변수에 불러온 이미지 대입 가능cv::VideoCapture::operator >> frame
으로>>
연산자를 통해 대입 가능
- 비디오 캡처에 대한 모든 작업이 완료 되었으면
release()
함수를 이용해 메모리에서 제거한다.
영상 정보 얻기
.get(flag)
함수로 영상에 대한 정보를 얻을 수 있음cv::CAP_PROP_FPS
; 영상의 fps를 얻음cv::CAP_PROP_FRAME_WIDTH
; 영상의 width 를 얻을 수 있음
.set(flag)
함수로 영상에 대한 정보값을 세팅할 수 있음
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
#include "opencv2/opencv.hpp"
#include <iostream>
int main(void)
{
cv::Mat frame;
cv::VideoCapture cap(0); // 선언과 동시에 초기화
// cv::VideoCapture cap();
// cap.open(0); // 선언 후 open 함수를 통한 초기화
if(!cap.isOpened())
{
std::cerr << "the video has not ready.";
return -1; // 영상이 열리지 않았으면 종료
}
while(cap.isOpened())
{
cap >> frame;
cap.read(frame); // 미리 선언 한 frame 에 read 한 이미지 대입
std::cout << "Frame size is " << cap.get(cv::CAP_PROP_FRAME_WIDTH) << ", " << cap.get(cv::CAP_PROP_FRAME_HEIGHT) << std::endl;
if(!frame.rows > 0)
{
std::cout << "video is over." << std::endl;
break;
}
cv::imshow("debug", frame);
if(cv::waitKey(cap.get(cv::CAP_PROP_FPS)) == 27)
{
break;
}
}
cv::destroyAllWindows();
cv::release();
return 0;
}
Video Writer
- 이미지나 영상의 프레임을 영상의 형태로 저장하는 클래스
cv::VideoWriter::fourcc(codec name(4 char));
로 저장할 비디오의 코덱 형식을 지정int
형식의 4개의 숫자
cv::VideoWriter wrt;
선언을 통해VideoWriter
객체를 선언하고wrt.open();
을 통해 초기화한다.wrt.open("path/to/file_name", fourcc, fps, size);
cv::Size(width, height)
- 프레임을 저장할 땐
write()
함수를 사용하거나 재정의 된<<
연산자를 이용한다. - 모든 처리가 끝나면 마찬가지로
release()
함수를 실행한다.
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
#include "opencv2/opencv.hpp"
#include <iostream>
int main(void)
{
cv::Mat frame;
cv::Mat outFrame;
cv::VideoCapture cap("./path/to/video"); // 프레임을 캡처 할 카메라, 혹은 영상 파일
cv::VideoWriter wrt;
int fourcc = cv::VideoWriter::fourcc('X', 'V', 'I', 'D'); // 코덱 정의
wrt.open("./path/to/save/file", fourcc, cap.get(cv::CAP_PROP_FPS), cv::Size(cap.get(cv::CAP_PROP_FRAME_WIDTH), cap.get(cv::CAP_PROP_FRAME_HEIGHT)));
while(cap.isOpened())
{
cap >> frame;
if(!cap.rows > 0)
{
break;
}
wrt << frame; // 저장
// wrt.write(frame); 으로도 지정 가능
}
wrt.release();
cap.release();
return 0;
}