2014-10-10 2 views
7

동영상을 녹화하여 스트림으로 보내려면 OpenCV을 사용하고 싶습니다. 나는 초보자이며 OpenCV가 주 스레드를 차단하는지 또는 스레드 자체인지 여부를 알아야합니까?OpenCv가 이미 스레드 되었습니까?

OpenCV 설명서 (2.4.9)를 읽었으며 어떤 대답도 찾을 수 없습니다.

읽어 주셔서 감사합니다.

+0

차단 중입니다. 적어도 내가 아는 모든 기능. – Micka

답변

5

OpenCV는 함수를 호출 할 때 스레드를 생성 할 수 있습니다. 그러나 모든 작업은 호출 스레드에 제어가 반환되기 전에 수행됩니다. 여러 가지 이유로 인해 비동기 처리는 상당한 복잡성을 추가합니다. 예를 들어, 여러분의 프로그램은 계산이 언제 어떻게되는지 알았을 것입니다. 프로그램이 비동기 일 필요가 없다면 그것은 또한 원하지 않는 오버 헤드를 유발할 것입니다.

최소한의 노력으로 비동기 처리를 수행 할 수 있지만 C++11's threading API입니다.

+2

예, 스레드가 생성 될 수 있습니다. OpenCV는 여러 스레드를 사용하여 서로 다른 데이터 청크 ("병렬 영역")를 병렬로 처리 할 수 ​​있습니다. 자세한 내용은 [setNumThreads] (http://docs.opencv.org/modules/core/doc/utility_and_system_functions_and_macros.html#setnumthreads) 및 근처 기능을 참조하십시오. – artm

+0

아, 좋은 지적이야. 내가 분명히하자. – thirtythreeforty

3

OpenCV로 OpenCV를 빌드하면 컴퓨 트 기능이 컴퓨터의 사용 가능한 모든 코어를 사용하도록 만들 수 있습니다. OpenCL 및 CUDA로도 구축 할 수 있습니다. 또한 SIMD 최적화 플래그가 있습니다.

이러한 지원으로 빌드하지 않으면 단일 스레드로 실행됩니다.

OpenCV 함수를 호출하면 은 모든 작업을 계산할 때까지 런처 스레드을 차단합니다. 계산을 GPU로 오프 로딩 할 때조차도 마찬가지입니다.

+1

제목에도 불구하고 주요 질문은 "OpenCV가 주 스레드를 차단하는지" – Micka

0

OpenCV의 parallel_for 연산은 작동 할 다중 스레드를 만듭니다. 스레드 풀을 작성하고 스레드 풀을 가로 질러 작업을 분산시킵니다.

스레드 수는 setNumThreads 기능에 의해 결정됩니다. 직렬 작업의 경우 0으로 설정하십시오. [이것은 opencv가 빌드하는 스레딩 라이브러리에 따라 변경됩니다. 어떤 경우에는 1입니다.

참고 : 내 스레드 풀을 관리 할 때 스레드 문제가있었습니다.

관련 문제