Datenaustausch zwischen unterschiedlichen Programmen

Alles rund um die Programmierung mit Qt
Antworten
Tuxing
Beiträge: 52
Registriert: 28. Oktober 2009 11:13

Datenaustausch zwischen unterschiedlichen Programmen

Beitrag von Tuxing »

Guten Tag zusammen,

ich habe das Problem, dass ich Danten (insbesondere Bilder) zwischen Programmen austauschen möchte. Es wird ein Programm A zur Ansteuerung einer Webcam, zum Laden von Videos oder Bildern geschrieben, dass mit Hilfe von OpenCV die entsprechende Quelle lädt.

Zusätzlich wird es ein Anzeigeprogramm B geben, dass die Bilder von A anzeigen soll. Folgende Ansätze habe ich versucht:
- stumpfes versenden via udp (zu langsam bei Videos mit 30 fps)
- Teilen eines SharedMemorie-Bereichs (s. http://www.qtforum.de/forum/viewtopic.php?f=1&t=14978)
Das war auch eher ein flopp, da es zu lange dauert die Bilder da immer rein zu schreiben (auch trotz JPEG kompression
mit QImageWriter)
- Abspeichern in jpg-Dateien und mit den anderen Programmen laden: Ist aber sehr unschön.

Gibt es da nicht irgendein Standardverfahren für sowas. Ich hab schon an Streaming gedacht aber ob das das mittel der Wahl ist ?!

Danke für weitere Hinweise
trendyAndy
Beiträge: 54
Registriert: 27. März 2009 15:01

Re: Datenaustausch zwischen unterschiedlichen Programmen

Beitrag von trendyAndy »

Servus!

Ich habe das Thema jetzt erst gesehen. Ich habe mit sowas noch nicht rum gespielt, aber die SingleApplication sendet Nachrichten von Programm a nach Programm b über einen QLocalSocket/QLocalServer. Zwar sind das in dem Fall nur Strings, aber warum sollte man mit der Methode nicht auch andere Daten austauschen können.
Bist du da weiter gekommen??

Gruß
Andy
dennisDennis
Beiträge: 17
Registriert: 23. September 2011 16:21

Re: Datenaustausch zwischen unterschiedlichen Programmen

Beitrag von dennisDennis »

Ein Farbbild mit 1204x1024 belegt im Speicher schon 4MB ( QImages sollten 32bit sein, damit sie schneller verarbeitet werden können).
4MB*30fps = 120MB/sec. Wenn man 120mb mehrmals pro Sekunde kopieren muss, könnte es langsam werden...

Am schnellsten geht es wenn man ein Array von QImages erstellt.
Die QImages werden so erzeugt, dass sie die Ausmaße und den ColorMode der IplImages haben.
Mit QImages::bits() holt man sich die Adresse für die Bildaten und lässt Opencv direkt dort rein schreiben.
Dann werden die Bilder genau 1x in den Speicher geschrieben und brauchen nicht kopiert werden.

Im Optimalfall benutzt man einen Framegrabber, der die Bilddaten dort über DMA ablegt... und keine popelige USB Webcam :mrgreen:
Tuxing
Beiträge: 52
Registriert: 28. Oktober 2009 11:13

Re: Datenaustausch zwischen unterschiedlichen Programmen

Beitrag von Tuxing »

dennisDennis hat damit recht. Allerdings kann der Pointer nur innerhalb einer Anwendung verwendet werden, wenn ich mich nicht vertue. Ich kann nicht hingehen und die Adresse der Bilder an ein anderes Programm schicken, sodass dieses dann auch die Bilder zugreift. Die Programme haben ja ihre eigenen Speicherbereiche.

Ich habe es jetzt so gemacht, wie ich es hier: http://www.qtforum.de/forum/viewtopic.php?f=1&t=14978 beschrieben habe. Vielleicht hilft es euch weiter.

Grüße
Antworten