2011-05-04 2 views
1

현재 비디오 파일 (일반적으로 AVI)을 가져 와서 이미지로 변환하려고하는 프로그램을 만들려고합니다. 지금까지 나는 프로세스가 완벽하게 작동하고 필요하다면 혼자 남을 수있었습니다. 그러나 속도를 위해 최적화 할 수 있는지 알고 싶습니다. 그래서 내 질문은 스트리밍 대신 청크에 의해 메모리 청크 비디오 파일의 일부를로드 할 수 있는지 경우입니다. 어쩌면 2 ~ 3 분짜리 클립을 버퍼에로드하고 처리 한 다음 2 ~ 3 분간 다시 사용할 수 있습니다. Direct Show와 OpenCV로 비디오 파일을로드하고 재생하는 방법을 살펴 보았지만 비디오를 버퍼에로드하는 것과 관련하여 아무 것도 찾을 수 없었습니다. 자습서 또는 개념에 대한 링크는 크게 감사하겠습니다.비디오 파일을 C++의 버퍼에로드합니다.

이 기능은 Windows XP/7 시스템에서 개발 될 예정입니다.

답변

2

몇 가지 프레임을로드하여 N 프레임 덩어리라고 부를 수 있습니다. 디스크의 큐에 넣을 수 있습니다. 버퍼에 대한 제한을 설정하면 프레임을 당겨 처리합니다. 두 개의 대기열 (Q1과 Q2)과 두 개의 스레드 (T1과 T2)를 사용하여 병렬로 수행 할 수 있습니다. T2를 사용하여 Q1에서 프레임을 처리하는 동안 T1을 사용하여 Q2를로드 할 수 있습니다. 꽉 차있을 때 컨텍스트 스위칭 하나의 큐를 수행하고 다른 큐가 디스크의 프레임으로로드되는 동안 프레임을 풀어 처리합니다. 물론 이러한 접근 방식과 관련된 스레딩/병렬화 복잡성을 처리해야하며,이 경우 BOOST 스레딩이 도움이 될 수 있습니다.

+0

나는 그것을 이해하지만 내가 묻는 질문은 버퍼에 프레임을로드하는 방법이다. – Seb

+0

@Seb, 버퍼에 의해 일반적으로 메모리를 의미하는 경우, 내가 말할 수있는 것은 IPLImage 유형의 큐를 생성한다는 것입니다. 일단 그 프레임을 사용할 수있게되면 간단히 프레임을 밀어 넣으면됩니다. 그 방법으로 버퍼를 생각해. –

+0

@Wajih, 그게 효과가있는 것처럼 들리네. 이 경우 비디오 파일을 두 번 열어서 각 스레드가 필요한 이미지의 일부를 큐에 넣을 수 있습니까? 스레드 1은 비디오 파일의 0 시부 터 1시 59 분까지 가고 스레드 2는 2 시부 터 3시 59 분까지 또는 병 목이됩니까? – Seb

1

같은 애플리케이션의 병목 디스크로부터 파일을 판독하고,이 화상 으로 각 프레임을 변환한다. 이러한 작업에서 벗어날 수는 없습니다. 잘못된 방식으로하지 않는 한, 응용 프로그램의 실행 속도를 크게 높일 수있는 방법은 없습니다.

이미지를 디스크에 다시 쓸 필요 없기를 바랍니다.

+0

이미지는 어느 시점에서 디스크에 기록되어야합니다. 이 경우 최대량의 버퍼에 도달 할 때까지 비디오 파일의 일부를 처리 할 생각입니다. 그런 다음 해당 버퍼를 처리하여 이미지를 생성합니다. 프로세스를 반복하기 전에 메모리 소비가보기 좋거나 이미지를 디스크로 밀어 넣기 시작하면 프로세스를 반복합니다. – Seb

+0

하나의 스레드가 파일을 읽고 프레임을 이미지로 변환하고, 다른 스레드는이 이미지를 검색하여 디스크에 기록합니다. 때로는이 시스템을 개발하는 데 필요한 작업량이 짧은 성능 향상을 제공하는 것은 아닙니다. – karlphillip

관련 문제