2016-10-11 2 views
0

Mein Ziel ist es, meine bereits existierende Bildverarbeitungs-Pipeline (geschrieben in Halide) mit OpenCV-Funktionen wie NL zu verbessern. OpenCV-Funktionen sind nicht in der Lage, die Scheduling-Funktionalität von Halide zu nutzen. Daher ist geplant, jeden Halide-Func vor jeder OpenCV-Phase zu realisieren. Die verbleibende Frage ist, wie man am besten von einem Halogenid-Bild (dem Ergebnis der Func-Realisierung) zu einer OpenCV-Matte (als Eingabe für eine OpenCV-Funktion) und von OpenCV Mat zu Halogenid-Bild, wenn es fertig ist, konvertiert. Meine Halogenbilder sind vom Typ float und haben 3 Kanäle.Wie konvertiert man OpenCV Mat zu Halide Image und zurück?

Eine offensichtliche Lösung ist das Schreiben von Funktionen, die die Daten von einem Datentyp auf den anderen kopieren, aber das erscheint mir als verschwenderisch. Es wird nicht nur viel Zeit brauchen, um die Daten zu kopieren, sondern es wird auch Speicher verschwendet, da das Bild dann als zwei verschiedene Datentypen gespeichert wird. Gibt es eine Möglichkeit, Zeiger oder Datenpuffer zu verwenden, um die Bilddaten einfach in ein neues Format umzubrechen? Hoffentlich wäre dieser Prozess reversibel, so dass ich von Halide zu OpenCV wechseln kann, und dann nach der OpenCV-Funktion zurück zu Halide.

Antwort

0

Ja, Sie können das Kopieren von Daten vermeiden. Ich sehe zwei mögliche Ansätze: Entweder reserviere Speicher selbst und verweise auf diesen Speicher sowohl in einer OpenCV Mat-Instanz als auch in einer Halide buffer_t-Struktur; oder lassen Sie die Mat-Klasse von OpenCV den Speicher zuweisen und auf diesen Speicher in einer buffer_t-Struktur verweisen.

Zum ersten Ansatz können Sie eine Mat Konstruktor verwenden, die einen Datenzeiger nimmt:

float* data = new float[3 * width * height]; 
cv::Mat image(height, width, CV_32FC3, data, AUTO_STEP); 

Für den zweiten Ansatz, können Sie die üblichen Konstruktor oder Mat verwenden :: create-Methode:

cv::Mat image(height, width, CV_32FC3); 

buffer_t buffer; 
memset(&buffer, 0, sizeof(buffer)); 
buffer.host = image.data; 
buffer.elem_size = image.elemSize1(); 
buffer.extent[0] = image.cols; 
buffer.extent[1] = image.rows; 
buffer.extent[2] = image.channels(); 
buffer.stride[0] = image.step1(1); 
buffer.stride[1] = image.step1(0); 
buffer.stride[2] = 1; 
:

in beiden Fällen können Sie so etwas wie den folgenden Code wickeln Sie den Speicher in einer Halide buffer_t Struktur verwenden

Jetzt sollten Sie in der Lage sein, mit OpenCV- und Halide-Funktionen im selben Speicher zu arbeiten.

+0

Vielen Dank für Ihre Antwort Eric. Ich habe meinen Code so eingestellt, dass er genau so funktioniert, wie Sie ihn beschrieben haben, und er funktioniert größtenteils für OpenCV und auch für Halide. Das eine seltsame Problem ist, dass, wenn ich ein Bild aus dem Puffer machen: Bild Eingabe (Puffer); Die Ausgabe sieht falsch aus. – Kantthpel

+0

Sorry, wir können die Kommentare nicht bearbeiten. Ich wollte sagen, dass, wenn ich das Bild wie aus dem Puffer erstellt speichern, die Ausgabe scheint falsch zu sein. Wenn sie jedoch durch irgendeinen Func geleitet werden, scheinen die Daten korrekt gespeichert zu sein, da die Ausgabe eines Func, der keine Berechnungsergebnisse ausführt, in der korrekten Ausgabe gespeichert wird. Es scheint, dass der Akt der Weitergabe des Bildes durch den Func etwas in dem aus dem Puffer erstellten Bild falsch korrigiert – Kantthpel

+0

Ein alternativer Vorschlag für das seltsame Verhalten könnte sein, dass die save_image Halogenid Funktion nicht in der Lage ist, die Schritte korrekt zu analysieren Puffer. Mein Grund dafür ist, dass wenn die Eingabedaten planar sind, das Bild sowohl vor als auch nach dem Durchlaufen eines leeren Func korrekt aussieht. Wenn jedoch die Eingabedaten verschachtelt sind (der Standardwert für OpenCV), dann sieht nur das Bild korrekt aus, das durch das leere Func geschickt wird. – Kantthpel