INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

GetImagePixelPointer Problem



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

02.02.2009, 17:35
Beitrag #1

Nanotech Offline
LVF-Neueinsteiger


Beiträge: 5
Registriert seit: Aug 2007

7.1.1 8.0 8.2.1
2007
kA

65201
Deutschland
GetImagePixelPointer Problem
Guten Abend,

ich versuche gerade Daten auf meiner Grafikkarte unter verwendung von Nvidias CUDA verrechnen zu lassen. Dieser Teil funktioniert auch bestens jedoch schaffe ich es im moment nicht die Daten aus LabVIEW an die DLL zu übergeben. Ich verwende von Seiten von LabVIEW aus das GetImagePixelPointer VI und übergebe somit nur einen Pointer to Value der die Adresse des ersten Elements enthält an die DLL. Funktioniert auch wenn ich in der DLL den Wert mit z.B. unsigned long x=*PixelPointer auslese dann lese ich die gleiche Adresse, welche mir auch am Ausgang des GetImagePixelPointer VI angezeigt wird. Mein Problem ist es im Moment jedoch die Daten die hinter der Adresse stehen an ein C Array zu übergeben. Ziel ist es ein Image aus LabVIEW in ein C Array zu Überführen um in C weiter mit diesem Array zu arbeiten.

Ich verwende LabVIEW 8.2.1 mit dem zugehörigen Vision Paket. Visual C++ 2005 Express Edition.

Wie kann ich einem C Array die vom GetImagePixelPointer VI übergebene Adresse zuweisen.

Über Hilfe würde ich mich sehr freuen.

Vielen Dank im voraus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
02.02.2009, 20:08
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
GetImagePixelPointer Problem
' schrieb:Guten Abend,

ich versuche gerade Daten auf meiner Grafikkarte unter verwendung von Nvidias CUDA verrechnen zu lassen. Dieser Teil funktioniert auch bestens jedoch schaffe ich es im moment nicht die Daten aus LabVIEW an die DLL zu übergeben. Ich verwende von Seiten von LabVIEW aus das GetImagePixelPointer VI und übergebe somit nur einen Pointer to Value der die Adresse des ersten Elements enthält an die DLL. Funktioniert auch wenn ich in der DLL den Wert mit z.B. unsigned long x=*PixelPointer auslese dann lese ich die gleiche Adresse, welche mir auch am Ausgang des GetImagePixelPointer VI angezeigt wird. Mein Problem ist es im Moment jedoch die Daten die hinter der Adresse stehen an ein C Array zu übergeben. Ziel ist es ein Image aus LabVIEW in ein C Array zu Überführen um in C weiter mit diesem Array zu arbeiten.

Ich verwende LabVIEW 8.2.1 mit dem zugehörigen Vision Paket. Visual C++ 2005 Express Edition.

Wie kann ich einem C Array die vom GetImagePixelPointer VI übergebene Adresse zuweisen.

Über Hilfe würde ich mich sehr freuen.

Vielen Dank im voraus

Warum willst Du das tun? Ein Array ist im Prinzip auch nur ein Pointer genau so wie der Wert den Du von GetImagePixelPointer bekommst.
Das Problem hierbei ist aber dass die Interpretation des Speichers an diesem Pointer von einer Anzahl Dingen abhängt. Erstens ist der IMAQ Bilddatentyp wichtig. Der bestimmt nänlich ob die Pixels als Bits, Bytes, 16Bit oder 32Bit Integers oder gar Floats interpretiert werden müssen. Der Pointer selber sagt Dir darüber nichts, das musst Du zuvor mit der entsprechenden IMAQ Funktion ermitteln und den PixelPointer nur an Deine DLL übergeben wenn Du sicher bist dass die damit umgehen kann (und im Fall dass Du mehrere Formate unterstützt diesen Wert auch an die Funktion mitgeben. Danach musst Du die Dimensionen des Bildes wissen um zu wissen wie gross der gültige Speicherbereich ist auf den der PixelPointer weist. Du willst schliesslich nicht darüber hinaus schreiben, was ziemlich verheerende Folgen für Deine Applikation hat. Als extra Komplikation verwenden die meisten Bildformate (auch die IMAQ Formate) ein sogenanntes Padding, das helfen soll neue Bildzeilen auf einer Adresse beginnen zu lassen die ein ganzzahliges Vielfaches eines Wertes von 2 oder 4 Byte ist. Diese rowBytes wird Dir jeweils von der GetImagePixelPointer Funktion ebenfalls zurückgegeben.

Grundsätzlich kannst Du Deine DLL Funktion also etwa so deklarieren:

MgErr __cdecl DoSomething(char *imagePointer, int32 imageType, int32 rowBytes, int32 x, int32 y, <andere Parameter>);

Den imagePointer konfigurierst Du in der Call Library Node als unsigned 32 Bit Integer passed by value und übergibst diesem Parameter den pixelPointer Wert den Du von GetImagePixelPointer erhalten hast. Rest sollte sich wohl irgendwie weisen wenn Du den etwas C Kenntnisse hast. Ohne C Kenntnisse kann ich Dir hier noch stundenlang alles erklären und wird es doch schieflaufen.

Soviel sei gesagt: Du wirst hier nicht ohne C type casts auskommen. Also wirst Du Dir wohl auf Basis des imageTyps eine case Struktur machen in der Du jeweils einen Pointer des Typs deklarierst der diesem imageTyp enstpricht und dann mit geeigneter Pointerarithmetik den Offset berechnen.

etwa so:

[code] switch (imageType)
{

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.02.2009, 08:01
Beitrag #3

Nanotech Offline
LVF-Neueinsteiger


Beiträge: 5
Registriert seit: Aug 2007

7.1.1 8.0 8.2.1
2007
kA

65201
Deutschland
GetImagePixelPointer Problem
Guten Morgen,

vielen dank für die Antwort. Zunächst mal eine Frage und zwar wenn ich den ImagePointer by value übergeben dann sieht mein Funktionsprototyp doch nicht so aus wie du ihn gerade Angegeben hast aus sondern so

MgErr __cdecl DoSomething(unsigned long imagePointer, int32 imageType, int32 rowBytes, int32 x, int32 y, <andere Parameter>);

oder irre ich mich da?

Laut dem beispiel von NI sollte der Prototyp so aussehen wie du ihn beschrieben hast aber wenn ich den ImagePointer als Type Numeric, DataType U32 pass by value deklariere dann sieht das aus wie ich ihn gerade oben beschrieben habe.

Alles andere hört sich logisch an so oder so ähnlich sieht es bei mir auch schon aus.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.02.2009, 08:45 (Dieser Beitrag wurde zuletzt bearbeitet: 03.02.2009 09:53 von rolfk.)
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
GetImagePixelPointer Problem
' schrieb:Guten Morgen,

vielen dank für die Antwort. Zunächst mal eine Frage und zwar wenn ich den ImagePointer by value übergeben dann sieht mein Funktionsprototyp doch nicht so aus wie du ihn gerade Angegeben hast aus sondern so

MgErr __cdecl DoSomething(unsigned long imagePointer, int32 imageType, int32 rowBytes, int32 x, int32 y, <andere Parameter>);

oder irre ich mich da?

Laut dem beispiel von NI sollte der Prototyp so aussehen wie du ihn beschrieben hast aber wenn ich den ImagePointer als Type Numeric, DataType U32 pass by value deklariere dann sieht das aus wie ich ihn gerade oben beschrieben habe.

Alles andere hört sich logisch an so oder so ähnlich sieht es bei mir auch schon aus.

Das ist halt einfach ein bisschen C Pointer Kenntnis. LabVIEW besitzt keinen Datentyp der spezifisch einen Pointer beschreibt (das ist nicht mehr ganz wahr da der Call Library Node Configuration Dialog in 8.6 einen neuen Pointer Sized signed/unsigend Integer Datentyp kennt, aber auch der wird LabVIEW intern grundsätzlich als signed/unsigned 64Bit Integer behandelt und nur beim Aufruf der Shared Library Funktion korrekt in das für die aktuelle Platform gültige Format (32Bit/64Bit) umgewandelt).

C Pointer auf arbitrary Objekte die in LabVIEW nicht direkt mit LabVIEW eigenen Nodes angesprochen werden müssen, werden daher im Diagramm immer als eine Integerzahl behandelt. Das heisst Dein GetImage Pointer der ja ein uInt32 (unsigned long) ist, ist eigentlich ein void*. Das geht nicht anders wenn man C Pointer im LabVIEW Diagram rumreichen will. Wenn Du diesen Pointer dann wieder an eine C Funktion gibst musst Du halt diese Datenkonversion selber im Kopf machen. In LabVIEW sagst Du der Call Library Node, sieh hier das ist ein uInt32, aber in der DLL Funktion sagst Du dem C Compiler, schau hier kommt ein void* (oder in meinem Beispiel halt ein char* da damit die Offsetberechnung gleich korrekt passiert). In C kann man mit einem void* Pointer keine Pointerarithmetik machen da der C Compiler ja nicht weiss was die Elementgrösse ist worauf der Pointer weist.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.02.2009, 09:17
Beitrag #5

Nanotech Offline
LVF-Neueinsteiger


Beiträge: 5
Registriert seit: Aug 2007

7.1.1 8.0 8.2.1
2007
kA

65201
Deutschland
GetImagePixelPointer Problem
Vielen Vielen Dank hab im ersten Moment echt ziehmlich auf dem Schlauch gestanden, jetzt läuft es.

Kann aber nicht versprechen das nicht noch weitere Fragen kommen

MFG

Nanotech
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Gehe zu: