video sequence processing operation effects 효과
비디오 시퀀스 처리
int delay;// 처리된 프레임 개수 long fnumber;// 중지할 프레임 수long frameToStop;// 처리 중지
bool stop;
public:
Video Processor() : callit (true), delay(0), fnumber (0), stop (false), frameToStop (-1) () 1
첫 번째 멤버 변수는 cv:: VideoCapture 객체이고, 두 번째 멤버 변수는 콜백 함수를 가리킬 process 함수 포인터다. 대응하는 세터 메소드를 사용해 지정한다.
// 각 프레임에 대해 호출할 콜백 함수 설정
void setFrame Processor void (*frame ProcessingCallback) (cv:: Mat&, CV:: Mata)) { process= frameProcessingCallback; }
그리고 다음 메소드는 비디오 파일을 열기 위한 것이다.
// 비디오 파일명 설정 bool setInput (std::string filename) fnumber= 0; // 이 경우 VideoCapture 인스턴스와 연관된 자원이 이미 있음 capture.release(); images.clear(); // 비디오 파일 열기 return capture.open(filename);클래스를 사용해 다음과 같이 단계별로 달성한다.
// 인스턴스 생성 Video Processor processor; 77 비디오 파일 열기 processor.setInput("../bike.avi"); // 비디오를 표시할 창 선언 processor.displayInput ("Current Frame"); processor.displayOutput ("Output Frame"); 77 원 프레임 속도로 비디오 재생 processor.setDelay(1000./processor.getFrameRate()); // 프레임 처리기인 콜백 함수 설정 processor.setFrame Processor (canny); // 처리 시작 processor.run();
이제 클래스를 사용하는 방법을 정의했으므로, 각 구현을 살펴보자. 예상했던 대로 클래스는 비디오 프레임 처리의 다른 부분을 제어하는 여러 가지 멤버변수를 포함하고 있다.
비디오 프로세스 및 video capture 방법
class Video Processor {
private:// OpenCV 비디오 캡처 객체cv::VideoCapture capture;// 각 프레임 처리에 대해 호출하기 위한 콜백 함수void (*process) (cv::Mat&, cv::Mat&);// 처리할 콜백이 호출됐는지를 조사하기 위한 불리언bool callit;// 입력을 보여주는 창 이름std::string windowNameInput;// 결과를 보여주는 창 이름std::string windowNameOutput;// 각 프레임 처리 사이의 지연
비디오 프레임 처리 Video frame compresssion effects
이번 예제의 목표는 비디오 시퀀스의 각 프레임에 대한 몇 가지 처리를 적용하는 데 있다. 따라서 OpenCV 비디오 캡처 프레임워크를 클래스로 캡슐화하는 작업을 수행한다. 무엇보다도 클래스에서 새로운 프레임을 추출할 때마다 호출하는 함수를 지정한다.
예제 구현
원하는 것은 비디오 시퀀스의 각 프레임에 호출하는 처리 함수(콜백 함수)를 지정할 수 있는 것이다. 이 함수는 cv:: Mat 인스턴스를 받는 것과, 결과이자 처리를 거친 프레임을 정의할 수 있다. 그러므로 다음 시그니처를 갖고 설계한다.
void processFrame (CV::Mat& img, cv:: Mat& out);
위 처리 함수의 예로 다음 입력 영상에 대한 캐니 에지를 계산하기 위한 간단한 함수를 고려헤보자.
void canny (cv:: Mat & img, CV:: Mat& out) { // 그레이레벨로 변환 if (img.channels () == 3) cv::cvtColor (img, out, CV_BGR2GRAY); // 캐니 에지 계산 cv:: Canny (out, out, 100,200); // 영상 반전 CV:: threshold (out, out, 128,255, CV:: THRESH
BINARY INV);
자, 다음 콜백 함수와 연관할 수 있는 비디오 처리 클래스를 정의하자. 이 클래스를 사용하면 클래스 인스턴스를 생성하고, 입력 비디오 파일을 지정하고, 콜백 함수에 붙인 후 처리 시작하는 절차를 밟는다. 프로그래밍적으로 제안한
프레임별로 결과 프레임을 조사하는 가운데 처리를 추적하길 원할 때 매우 유용하다.
마지막 구문은 비디오 파일을 닫는 release 메소드를 호출한다. 이 호출은 불필요한데, cv:: VideoCapture 소멸자가 release를 호출하기 때문이다.
지정한 비디오 파일을 열려면 컴퓨터에서 대응하는 코덱을 반드시 설치해야 하는데, 그렇지 않으면 cv:: VideoCapture가 입력 파일을 이해할 수 없게 된다. 보통 자신의 컴퓨터에서 비디오 플레이어(윈도우 미디어 플레이어 같은 것)로 비디오 파일을 열 수 있다면 OpenCV는 당연히 이 파일을 읽을 수 있다.
컴퓨터에 연결된 카메라(예를 들어 USB 카메라)의 비디오 스트림 캡처를 읽을 수 있다. 이 경우 열기 함수에 파일명 대신 ID 숫자(정수)를 간단히 지정한다. ID를 0으로 지정하면 설치한 기본 카메라를 연다. 이런 경우 카메라의 비디오 스트림을 무한정 읽기 때문에 처리를 중지하기 위한 cv:: WaitKey 함수의 역할이 필요하게 된다.
‘비디오 시퀀스 쓰기’ 절에는 비디오 코덱에 대한 자세한 정보가 있다. ffmpeg.org 웹사이트는 오디오/비디오 읽기, 기록, 변환과 스트리밍에 대한 완전한 오픈소스와 교차 플랫폼 솔루션을 제공한다. 비디오 파일을 조작하기 위한 OpenCV 클래스는 이 라이브러리 상단에 내장됐다.
Xvid.org 웹사이트는 비디오 압축에 대한 MPEG-4 표준 기반 오픈소스 비디오 코덱 라이브러리를 제공한다. 또한 Xvid는 독점이지만, 무료 코덱과 소프트웨어 도구를 제공하는 DivX와 경쟁하고 있다.
capture.set (CV_CAP_PROP_POS_FRAMES, position);
또한 CV_CAP_PROP_MSEC를 사용해 밀리초로 위치로 지정하거나 CV_CAPPROP POS AVI_RATIO(0.0은 비디오의 시작, 1.0은 마지막에 대응)를 사용해 비디오 내부의 상대적인 위치를 지정할 수 있다. 이 메소드는 요청한 파라미터 설정이 성공했을 때는 true를 반환한다. 특별한 |오 파라미터를 가져오거나 설정할 가능성은 비디오 시퀀스를 압축하고 저장하기 위해 사용하는 코덱에 따라 크게 달라진다. 일부 파라미터로 실패했다면 순전히 사용하는 특정 코덱 때문일 수 있다.
비디오의 반복 호출을 통한 프레임 생성과 저장 방법
일단 비디오를 성공적으로 열었다면(isopened 메소드를 통해 검증한다) 이전 절의 예제에서 했던 것처럼 read 메소드를 반복 호출해 순차적으로 프레임을 얻을 수 있다. 오버로드된 읽기 연산자를 호출한 것과 동일하다.
capture >> frame;
두 가지 기본 메소드를 호출하는 것도 가능하다.
capture.grab(); capture.retrieve (frame);
또한 예제에서 각 프레임을 출력할 때 지연을 도입했다. 지연은 cv::waitKey 함수를 사용해 수행한다. 여기서 입력 비디오 프레임 속도(fps는 초당 프레임 개수라면 1000/fps는 두 프레임 사이의 밀리초인 지연이다)에 대응하는 값으로 지연을 설정한다. 매우 느리거나 빠른 속도로 비디오를 출력하기 위한 값을 확실히 변경할 수 있다. 그러나 비디오 프레임을 출력할 경우 창에서 새로 고침(낮은 순위의 프로세스이므로 CPU가 매우 바쁘면 결코 새로 고침할 수 없다)을 위한 충분한 시간을 갖기 위한 경우의 지연을 삽입하는 것이 중요하다. CV:: waitKey 함수는 임의의 키 입력으로 읽기 처리를 가로챈다. 이런 경우 입력한 키의 아스키코드를 반환한다. cv::waitKey 함수에 지연을 0으로 지정했다면 사용자가 키를 입력하길 무한정 기다린다.