Frage

ich meine eigenen Gaußsche Filter schreiben, aber es ist sehr langsam.

OpenCV die Gauß-Algorithmus ist viel schneller, 20-mal als mein Gaußsche Filter. Ich mag OpenCV des Gauß-Algorithmus in meinem Projekt neu zu schreiben, und ich will nicht opencv in meinem Projekt einzubeziehen.

Allerdings

  

Kann mir jemand gibt die Algorithmus Beschreibung, opencv Quellcode   zu hart scheint zu verstehen?

War es hilfreich?

Lösung

Die Gauß-Filter haben eine Eigenschaft, die es sehr einfach macht, zu beschleunigen: Der Filter kann unabhängig in beiden Dimensionen angewandt werden. Sie definieren einen eindimensionalen Filter, der vertikal arbeitet, und eine andere, die horizontal betrieben wird, und wendet sie beides; Dies ergibt die gleiche Wirkung wie ein einziges Filter in zwei Dimensionen angewendet wird.

Darüber hinaus, müssen Sie wahrscheinlich an den SIMD-Befehle suchen z.B. SSE3 für Ihren Prozessor zur Verfügung.

Andere Tipps

Um den zweiten Teil Ihrer Frage zu beantworten, eine Gaußsche Unschärfe ist einfach die eine 3-D-Gaußsche Oberfläche als Faltungskern auf das Bild angewandt. Wikipedia hat einen großen Bezug auf den Algorithmus selbst, sondern im Grunde nehmen Sie die Werte einer Gaußschen Kurve und konvertiert, dass in eine quadratische Matrix, und es von jedem einzelnen Pixel in Ihrem Bild multiplizieren, zum Beispiel:

Kernel:               
[0 1 2 0 0
1 4 6 4 1      X   Iterate over every single pixel in the image
2 6 10 6 2
1 4 6 4 1
0 1 2 1 0]

(Beachten Sie, dass dies nur ein Beispiel Kernel gibt es sehr spezifische Gl, die, je nach Gauß-Variablen, werden Sie unterschiedliche Ergebnisse erhalten)

Um die Leistung Teil Ihrer Frage zu beantworten, die Gesamtgeschwindigkeit dieses Algorithmus würde auf ein paar Dinge abhängen, eine konstante Größe Bild annimmt. Läßt das Bild sagt NxM Pixel, und der Faltungskern ist PxP Pixel. Sie gehen zu müssen, P tun P N * M-Operationen. Je größer P, desto mehr Operationen Sie gehen zu müssen, für ein bestimmtes Bild zu tun. Sie können mit dem Algorithmus Sie hier verwenden listige bekommen, ganz bestimmte Zeile zu tun oder säulenMathematik.

Die Umsetzung ist auch sehr wichtig. Wenn Sie extrem effizient sein wollen, werden Sie wahrscheinlich wollen die fortschrittlichsten Anweisungen verwenden, die Ihre Architektur bietet. Wenn Sie einen Intel x86-Chip verwenden, werden Sie wahrscheinlich auf immer eine Lizenz für Intel Performance Primitives (IPP) und ruft diese Anweisungen direkt zu suchen. IIRC, OpenCV macht Gebrauch von IPP, wenn sie zur Verfügung stehende ...

Sie können auch mit allen skalierte ganzen Zahlen etwas sehr klug und arbeiten tun, wenn die Floating-Point-Performance auf dem gegebene Architektur schlecht ist. Dies würde wahrscheinlich die Dinge beschleunigen ein wenig, aber ich andere Optionen erste Straße, bevor sie nach unten schauen würde.

Versuchen Sie hier überprüfen. Sie möchten die diskrete Gaußsche Matrix vor der Zeit, um herauszufinden, es dann mit dem Bild convolve.

Wenn Ihr Faltungskern ist relativ groß und Sie direkte Faltung implementieren, kann der Unterschied in der Leistung sein, da OpenCV Faltung implementiert eine schnelle Fourier-Transformation verwenden (FFT).

Ich hasse pedantisch zu sein, aber Sie für einen Algorithmus fragen, das heißt, eine genaue Abfolge von Schritten benötigt, um eine Aufgabe zu erfüllen. Sie haben bereits die Gaußsche Algorithmus. So ist der entscheidende Punkt Ihrer Frage ist, wenn Sie nach etwas fragen, schneller , die als zu fragen für einen Algorithmus nicht das gleiche ist.

Zur Beantwortung der schneller Frage - Sie wollen wissen, wie OpenCV seinen Code optimiert, die eine sehr technische und weites Feld ist. Ich würde eine Vermutung Gefahr, indem er sagte es Assemblersprache verwendet und GPU-spezifischen Funktionen. Ich würde beginnen, indem Montage Lernen und die Erforschung der CUDA-Paket nutzen Ihre GPU zu nehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top