|
|
ActiveX COM-Objekt in Simulink einbinden |
|
Kenne |
Forum-Anfänger
|
|
Beiträge: 12
|
|
|
|
Anmeldedatum: 30.06.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2006b
|
|
|
|
|
|
Verfasst am: 04.07.2008, 13:57
Titel: ActiveX COM-Objekt in Simulink einbinden
|
|
|
|
|
Hallo,
hab mal wieder ein kleines Problemchen in Simulink
Ich will über ein ActiveX Objekt eine Kamera einstellen (Belichtungszeit, Abtastrate) und danach Bilder einlesen. Einen Active X Treiber vom Hersteller der Kamera ist vorhanden und tut auch in MatLab. der Haken ist nur, dass die Funktion zum Bilder Auslesen nue einen Zeiger auf die Bilddatenzurückgibt und MatLab damit nicht wirklich was anfangen kann.
Ich habe nun vor eine s-Function in C zu schreiben, da C keine Probleme mit Zeigern hat und ich so diese Funktion nutzen kann. Nur brauche ich dazu Zugriff auf das ActiveX COM-Objekt der Kamera. Bisher habe ich noch kein Erfolg gehabt, das COM-Objekt aus MatLab heraus anzusprechen.
Ich habe mir auch schon das "Gauges Blockset" angeschaut. Ich selber habe dieses leider nicht zur Verfügung. Soweit ich informiert bin, kann ich damit aber keine Einstellparameter an die Kamera übertragen.
Ich hoffe, dass mir da jemand weiterhelfen kann!
Ich selber bleibe natürlich auch dran und poste eventuelle Ergbnisse hier.
Kenne
|
|
|
|
|
Martin Ndong |
Forum-Newbie
|
|
Beiträge: 2
|
|
|
|
Anmeldedatum: 03.06.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.07.2008, 12:30
Titel:
|
|
Hallo Kenne,
ich habe noch keine große Erfahrung mit ActiveX COM-Objekten. Aber ich bin der Meinung, daß du dein Problemchen (voraussgesetzt ich habe es verstanden) etwas anders lösen kann. MatLab kann tatsächlich Zeigern auslesen. Wenn du einen Treiber vom Hersteller geliefert bekommen hast, dann gehe ich davon aus, daß du dem entsprechend über eine API zugreifen kannst. Sollte dies der Fall sein, kannst du über einen LoadLibrary-Befehl deine API in MATLAB laden und falls Pointers zu lesen sind, brauchst du diese nur über einen libpointer-Befehl zu lesen (Initialisierung nicht vergessen). Einzelheiten kann ich leider an dieser Stelle nicht betrachten, weil die Details zu deinem Anliegen mir nicht bekannt sind. Ich hoffe aber, daß ich dir einigermaßen inspiriert habe. Solltest du aber nicht weiterkommen, melde dich einfach. Meine Wenigkeit könnte schauen, wie wir da weiterkommen könnten.
Viele nette Grüße
|
|
|
Kenne |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 12
|
|
|
|
Anmeldedatum: 30.06.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2006b
|
|
|
|
|
|
Verfasst am: 07.07.2008, 15:34
Titel: RE: ActiveX COM-Objekt in Simulink einbinden
|
|
|
|
|
Hallo Martin,
vielen Dank schon mal für die Anregung.
Ich habe in dieser Richtung schon Versuche gemacht. Bis jetzt hat das aber nicht so ganz geklappt.
Ich verwende das "ActiveX Software Interface" der angeschlossenen Kamera. Die Kamera ist von IDS und heißt UI-1226LE-M.
Hier die Befehle:
*****************
% create new figure and open first camera found on system
h_fig = figure; %create new figure
IDS_cam = actxcontrol('UEYECAM.uEyeCamCtrl.1', [1 1 500 400], h_fig); %get activeX control handle of camera
IDS_cam.InitCamera(0); %initialisize first camera;
*****************
IDS_cam ist hier dann das sog. "Handle" mit dem über das erstellte COM-Objekt auf die Kamera zugegeriffen werden kann. Dies funktioniert soweit auch.
Mit dem Befehl "IDS_cam.GetImageMem" bekomme ich dann einen Pointer auf die Speicherstelle des Kamerabildes.
So sieht das dann in MatLab aus:
***********
>> IDS_pointer = IDS_cam.GetImageMem
IDS_pointer =
331095424
>> whos IDS_pointer
Name Size Bytes Class Attributes
IDS_pointer 1x1 4 uint32
***********
Wie man hier sieht, ist der Rückgabewert ein uint32 und somit für MatLab kein Pointer.
Danach habe ich folgendes mit dem "libpointer" ausprobiert:
***********
p_IDS_cam = libpointer('uint8Ptr',IDS_cam.GetImageMem);
>> whos p_IDS_cam
Name Size Bytes Class Attributes
p_IDS_cam 1x1 lib.pointer
>> get(p_IDS_cam,'Value')
ans =
72
>> get(p_IDS_cam +1 ,'Value')
??? Can not offset a pointer to be greater then the size of the data pointed to.
***********
Damit habe ich jetzt das erste Element auslesen können. Sobald ich aber den Zeiger erhöhen will um weitere Pixelwerte zu lesen bekomme ich eine Fehlermeldung.
Für mich heißt das, dass ich weiterschauen muss, wie ich den Offset für den Pointer verändern kann. Das Bild hat in meinem Fall nämlich 480x752 Bildpunkte, dei ich auslesen muss.
Meiner Lösung bin ich aber schon näher gekommen und ich werde dran bleiben.
Sobald ich das Bild direkt als Matrix auslesen kann soll die Funktion in eine sog. "s_Function" in Simulink eingebettet werden, damit ich das Bild dort direkt weiterverarbeiten kann.
Gruß
Kenne
|
|
|
Tomster |
Forum-Anfänger
|
|
Beiträge: 12
|
|
|
|
Anmeldedatum: 26.08.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 06.11.2009, 12:55
Titel: Gibts schon Lösungen?
|
|
Hallo!
Ich habe genau das selbe Problem - gibt es denn schon eine Lösung dazu?
Viele Grüße
|
|
|
Tomster |
Forum-Anfänger
|
|
Beiträge: 12
|
|
|
|
Anmeldedatum: 26.08.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 11.11.2009, 15:01
Titel:
|
|
Lösung: Image Acquisition Toolbox!
Pointer-Daten auslesen geht nur über eine C-Schnittstelle...
Viele Grüße
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|