LabVIEWForum.de
LabVIEW: Absturz nach externem Code-Aufruf - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: LabVIEW: Absturz nach externem Code-Aufruf (/Thread-LabVIEW-Absturz-nach-externem-Code-Aufruf)

Seiten: 1 2 3


LabVIEW: Absturz nach externem Code-Aufruf - IchSelbst - 11.09.2007 16:14

' schrieb:Nur leider hat das Bild nix mit dem von der Thermokamera aufgenommenen gleich.
Kann es sein, dass du in der verschachtelten For-Schleife cols und rows tauschen musst?


LabVIEW: Absturz nach externem Code-Aufruf - abrissbirne - 11.09.2007 16:29

' schrieb:Kann es sein, dass du in der verschachtelten For-Schleife cols und rows tauschen musst?

Das dachte ich auch schon, aber das ist leider nicht der Fehler.

Ich habe noch diesen Code in mein Skript eingebaut, um mir das gegrabbte Image als Bitmap zu speichern.

MbufExport(Puffer, M_BMP, ImageBuffer[PixelX][PixelY]);

Dadurch erhalte ich folgendes Bitmap

Und das ist genau 320x256 Pixel groß und die Darstellung die ich auch in meinem Graphen bräuchte.


LabVIEW: Absturz nach externem Code-Aufruf - rolfk - 14.09.2007 07:18

' schrieb:Als erstes möchte ich mich bei euch für eure Unterstützung danken. Ich bin ein kleines Stückchen weitergekommen und ohne eure Anregungen, hätte es entweder noch lange gedauert, oder aber ich hätte irgendwann aufgegeben. Hab nun ein Skript, dass mir Daten von der Kamera in einen Puffer speichert. LabVIEW bekommt mittels eines Pointers Wert für Wert übertragen. Das ganze Funktioniert auch und ich bekomme in meinem Intensitätsgraphen ein Image. Nur leider hat das Bild nix mit dem von der Thermokamera aufgenommenen gleich. Zum besseren Verständnis hab ich mal ein Screenshot hochgeladen und den Quellcode gibts jetzt:

#include "extcode.h"
#include <windowsh>
#include <mil.h>

#define PixelX 320
#define PixelY 256

typedef struct{
int32 dimSizes[2];
float64 Numerisch[1];
} TD1;

typedef TD1 **TD1Hdl;

typedef char *STRING;

extern "C" MgErr CINRun(TD1Hdl Array);

MgErr CINRun(TD1Hdl Array)
{
MgErr = noErr;
STRING DCF_File = "D:\Dokumente...";

Mil_ID
MilApplication = M_NULL,
MilSystem = M_NULL,
MilDigitizer = M_NULL,
ImagBuffer[PixelX][PixelY];

float64 *ptrResultElement;
int cols, rows;

MilApplication = MappAlloc(M_DEFAULT, M_NULL);
MilSystem = MsysAlloc(M_SYSTEM_SOLIOS, M_DEFAULT, M_COMPLETE, M_NULL);
MilDigitizer = MdigAlloc(MilSystem, M_DEFAULT, DCF_File, M_DEFAULT, M_NULL);
ImageBuffer[PixelX][PixelY] = MbufAlloc2d(MilSystem, PixelX, PixelY, M_UNSIGNED+16, M_IMAGE + M_DISP + M_GRAB + M_PROC, M_NULL);

Also ist das C++ oder was?

ImageBuffer = MbufAlloc2d(MilSystem, PixelX, PixelY, M_UNSIGNED+16, M_IMAGE + M_DISP + M_GRAB + M_PROC, M_NULL);

schiene mir wesentlich logischer. Aber da ich die Definition der Funktion und wie die ganzen Datentypen da deklariert sind nicht kenne kann ich da gar nichts sagen. Die Deklaration von Mil_ID und Mil.... ist schon sehr komisch.

Zitat:if(err = NumericArrayResize(fD, 2L, (UHandle*)&Array, PixelX * PixelY))
goto release;

(*Array)->dimSizes[0] = PixelX;
(*Array)->dimSizes[1] = PixelY;

Ist zwar nicht wirklich falsch aber ich stelle diese Arraygrösseninitialisiering immer nach dem eigentlichen Einfüllen der Daten.

Zitat:ptrResultElement = (*Array)->Numerisch;

if(MappGetError(M_GLOBAL, M_NULL))
goto release;

MdigGrab(MilDigitizer, ImageBuffer[PixelX][PixelY]);
if(MappGetError(M_GLOBAL, M_NULL))
goto release;

for(cols = 0; cols < PixelY; cols++)
{
*ptrResultElement = 0;
for(rows = 0; rows < PixelX; rows++)
{
*ptrResultElement = ImageBuffer[rows][cols];
ptrElementResult++;
}
}

Wo kommt den nun dieser ptrElementResult wieder her? Ich sehe das nirgends deklariert und das dürfte dann ja wohl einen Compilierfehler geben. Auch das *ptrResultElement = 0; ist völlig überflüssig.

Und wenn ich mir das Bild anschaue würde ich mal den Bereich der Intensitätsrampe anpassen. Der Signalverlauf gibt eindeutig an dass da Werte von 2E+9 drin sind aber Deine Rampe geht nur bis 100. Und wie die float64 Werte effektiv in Graustufen zu verwandeln sind ist auch noch experimentel auszuprobieren. Der Intensitätsgrpah ist da wohl nicht gerade die ideale Ausgabekomponente.

Rolf Kalbermatter