2014-10-10 5 views
7

Ich möchte OpenCV verwenden, um ein Video aufzunehmen und es als Stream zu senden. Ich bin ein Anfänger und ich muss wissen, ob OpenCV den Hauptfaden blockiert oder ist es selbst eingefädelt?Ist OpenCv bereits eingefädelt?

Ich lese OpenCV-Dokumentation (2.4.9) und ich konnte keine Antwort finden.

Danke fürs Lesen.

+0

Es blockiert. Zumindest alle Funktionen, die ich kenne. – Micka

Antwort

5

OpenCV kann Threads erzeugen, wenn Sie eine Funktion aufrufen. wird jedoch die gesamte Arbeit ausgeführt, bevor die Steuerung an den aufrufenden Thread zurückgegeben wird. Aus einer Reihe von Gründen würde die asynchrone Verarbeitung ein wesentliches zusätzliches Stück an Komplexität hinzufügen. (Betrachten Sie zum Beispiel: Wie würde Ihr Programm wissen, wann die Berechnung durchgeführt wurde?) Es würde auch einen unerwünschten Overhead verursachen, wenn das Programm nicht asynchron sein müsste.

Sie können die asynchrone Verarbeitung mit minimalem Aufwand selbst durchführen, mit C++11's threading API.

+2

Ja, es kann Threads spawnen. OpenCV kann mehrere Threads verwenden, um verschiedene Datenblöcke ("parallele Regionen") parallel zu verarbeiten. Weitere Informationen finden Sie unter [setNumThreads] (http://docs.opencv.org/modules/core/doc/utility_and_system_functions_and_macros.html#setnumthreads) und Funktionen in der Nähe. – artm

+0

Ah, guter Punkt. Lass mich das klären. – thirtythreeforty

3

OpenCV kann mit OpenMP-Unterstützung erstellt werden, damit die Rechenfunktionen alle verfügbaren Kerne auf Ihrem Computer nutzen. Es kann auch mit OpenCL und CUDA erstellt werden. Zusätzlich gibt es verschiedene SIMD-Optimierungs-Flags.

Wenn Sie es nicht mit einer solchen Unterstützung erstellen, wird es single-threaded ausgeführt.

In beiden Versionen blockiert das Aufrufen einer OpenCV-Funktion den Launcher-Thread, bis alle Operationen berechnet sind. Dies gilt auch, wenn die Berechnung auf eine GPU verlagert wird.

+1

Trotz des Titels, ich denke die Hauptfrage war, ob "OpenCV blockiert den Hauptthread" – Micka

0

OpenCVs parallel_for-Operationen erstellen mehrere Threads zum Bearbeiten. Er erstellt einen Thread-Pool und verteilt die Arbeit über ihn.

Die Anzahl der Threads wird durch die setNumThreads-Funktion festgelegt. Setze es für serielle Arbeit auf Null. [Dies ändert sich basierend auf der Threading-Bibliothek, mit der opencv erstellt wird. Für einige ist es 1]

Hinweis: Ich hatte einige Threading-Probleme, wo ich meinen eigenen Threadpool verwaltet.

Verwandte Themen