WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Laden von mehreren Bildern (DLL und DMD)

 

Philipp68
Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 20.02.2020, 15:03     Titel: Laden von mehreren Bildern (DLL und DMD)
  Antworten mit Zitat      
Hallo zusammen,
ich hoffe das ist nicht zu speziell und man kann ungefähr verstehen was ich möchte.
Ich arbeite mit einer Hardware (DMD), die beispielsweise Bilder über ein Spiegelarray darstellen kann.

Die Bilder lade ich wie folgt in den Speicher des Geräts

Code:

PicOffset = int32(0);
PicLoad = int32(0); % An Bildanzahl anpassen

assignin('base','PicOffset',PicOffset);
assignin('base','PicLoad',PicLoad);

% Geht
pic = imread('Testbild2.png'); % Darzustellende Bild
pic = rgb2gray(pic);
pic = fliplr(pic)';
imwrite(pic,'pic.png');

UserArray = uint8(pic); % UserArray (Bild) für den Speicher


UserArrayPtr = libpointer('voidPtr',UserArray);

[~, ~] = calllib('alp4395','AlpSeqPut', ALP_ID, SequenceID, PicOffset, PicLoad, UserArrayPtr); % DLL Funktion
 


Ein Bild zu laden und darzustellen funktioniert, mir ist nur schleierhaft, wie ich mehrere Bilder laden kann, die dann nacheinander dargestellt werden.
Über eine Schleifenwiederholung (je nach Anzahl der ausgewählten Bilder) den Befehl immer wieder neu unter der gleichen SequenceID durchführen oder über eine Art Bilderpaket? Leider steht in der Beschreibung nichts über mehrere Bilder, nur "UserArrayPtr - pointer to the user data to be loaded" und "pointer to a readable image data buffer.".
Ich würde die Bilder dann gerne über
Code:
[file,path,indx] = uigetfile('MultiSelect', 'on');

auswählen. Das habe ich gemacht und erhalte eine Cell-Struktur mit den Namen meiner Auswahl. Und von dort müsste ich nun weiterarbeiten bzw diese als UserArray übergeben.

Habe eben mal das "Befehl wiederholt ausführen" probiert und erhalte eine Fehlermeldung vom Gerät "Error accessing user data.".

Vielleicht hat jemand eine Idee wie man das umsetzen kann. Vielen Dank! : )
Private Nachricht senden Benutzer-Profile anzeigen


Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 26.02.2020, 14:13     Titel:
  Antworten mit Zitat      
Hallo, ich komme leider immer noch nicht weiter. Meine Versuche:

Code:

[file,path,indx] = uigetfile('*.png','MultiSelect', 'on');

[x, y] = size(file);

for i = 1:y
   
        UserArray{:,i} = imread(file{:,i});
       
       
        if size(UserArray{:,i},3) == 3
        UserArray{:,i} = rgb2gray(UserArray{:,i});
        end
       
        [numRos, numCols] = size(UserArray{:,i});
        if numCols == 1920 && numRos == 1080
        UserArray{:,i} = UserArray{:,i}';
        end

    % Pointer für Image Data    
    UserArrayPtr = libpointer('voidPtr',UserArray{:,i});

    % Befehl Image Data in Speicher zu laden
    STATUS_ALP_SEQ_PUT = calllib('alp4395','AlpSeqPut', ALP_ID, SequenceID,  PicOffset, PicLoad, UserArrayPtr);

    assignin('base',strcat('UserArray',num2str(i)),UserArray{:,i});
    assignin('base','UserArrayPtr',UserArrayPtr);
    assignin('base','STATUS_ALP_SEQ_PUT',STATUS_ALP_SEQ_PUT);
end
 


Funktioniert nicht, stellt nur ein Bild da.

Das zweite mal die Funktionen nacheinander ohne Schleife auszuführen. Damit stellt er auch nur das zweite Bild dar bzw. lädt er wohl nur das zweite Bild in den Speicher.

Code:


%% Bild 1

pic = imread('Schachbrett.png');
% pic = imresize(pic,[1080 1920]);
if size(pic,3) == 3
pic = rgb2gray(pic);
end
pic = fliplr(pic)';
imwrite(pic,'pic.png');
UserArray1 = uint8(pic);

UserArrayPtr = libpointer('voidPtr',UserArray1);
assignin('base','UserArrayPtr',UserArrayPtr);
[STATUS_ALP_SEQ_PUT1, ~] = calllib('alp4395','AlpSeqPut', ALP_ID, SequenceID, PicOffset, PicLoad, UserArrayPtr);

msgbox('Bild 1 geladen');

UserArrayPtr = [];
assignin('base','UserArrayPtr',UserArrayPtr);


%% Bild 2

pic = imread('Teilung.png');
% pic = imresize(pic,[1080 1920]);
if size(pic,3) == 3
pic = rgb2gray(pic);
end
pic = fliplr(pic)';
imwrite(pic,'pic.png');
UserArray2 = uint8(pic);

UserArrayPtr = libpointer('voidPtr',UserArray2);
assignin('base','UserArrayPtr',UserArrayPtr);
[STATUS_ALP_SEQ_PUT2, ~] = calllib('alp4395','AlpSeqPut', ALP_ID, SequenceID, PicOffset, PicLoad, UserArrayPtr);

msgbox('Bild 2 geladen');
%
%
%
%
assignin('base','pic',pic);
assignin('base','UserArray',UserArray1);
assignin('base','UserArray',UserArray2);

assignin('base','STATUS_ALP_SEQ_PUT1',STATUS_ALP_SEQ_PUT1);
assignin('base','STATUS_ALP_SEQ_PUT2',STATUS_ALP_SEQ_PUT2);

 


Die Fehlermeldung laut Header File lautet "Error accessing user data.".

Liegt es vielleicht daran, dass die Funktion pro Sequence ( Sequence 1 enthält x Bilder) nur ein Mal ausgeführt werden kann, bräuchte man für jedes Bild einen neuen Pointer?
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 27.02.2020, 16:48     Titel:
  Antworten mit Zitat      
Zur Vollständigkeit schreibe ich nochmal die Lösung.

Die Zeilen der Matrix müssen hintereinander geschrieben werden Zeile1+Zeile2+..+Zeile1080. Folgen mehrere Bilder, werden diese daran angehängt.

Code:

[file,~,~] = uigetfile('*.png','MultiSelect', 'on');
assignin('base','file',file);

[~, y] = size(file);

UserArray = [];

for i = 1:y
       
        Bild = imread(file{:,i});
       
       
        if size(Bild,3) == 3
        Bild = rgb2gray(Bild);
        end
       
        [numRos, numCols] = size(Bild);
        if numCols == 1920 && numRos == 1080
        Bild = Bild';
        end
       
        Bild = reshape(Bild, 1, []);
       
        UserArray = [UserArray, Bild];
       
end

UserArrayPtr = libpointer('voidPtr',UserArray);
STATUS_ALP_SEQ_PUT = calllib('alp4395','AlpSeqPut', ALP_ID, SequenceID, PicOffset, PicLoad, UserArrayPtr);
   
assignin('base','UserArray',UserArray);
assignin('base','UserArrayPtr',UserArrayPtr);
assignin('base','STATUS_ALP_SEQ_PUT',STATUS_ALP_SEQ_PUT);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.