Current Page: Greybox » Authoring » Course ID: medieninformatik » Modules » Module ID: m06 » Learning Units » Unit ID: 1_4_15
Last Modified:Tuesday, 2015-05-05 - 08:09:01
 
Tools: ValidatePreview XML Preview HTML Preview PDF
Alternative: Printable HTML

 

Learning Unit ID: 1_4_15
Title: Oracle interMedia Fallbeispiel
Abstract: Zuletzt zeigen wir ein Komplettbeispiel der Realisierung einer Bilddatenbank mit Oracle interMedia. Es werden sowohl die Speicherung, als auch die Suche demonstriert.
 
Status: Review II erfüllt. Version: 8.0
History:

Codeformatierung sieh erstelus.ppt - Done, please check and remove xIgnore.Done (bt).

Acronyme, Absätze und Wordanführungszeichen done.

@ Prof. Kosch: Laut Review II Einleitung zu erweitern und Einleitung in ganzen Sätzen. done.

Review von Prof. Kosch eingearbeitet.

Sourcecode inline gestellt.


Author
Author 1: Harald Kosch E-Mail: harald.kosch@itec.uni-klu.ac.at
Author 2: (empty) E-Mail: (empty)
Author 3: (empty) E-Mail: (empty)
Author 4: (empty) E-Mail: (empty)
Author 5: (empty) E-Mail: (empty)
Organization: (empty)

Content

interMedia : komplettes Beispiel

1

Auto

  • Beispiel : Bücherdatenbank
  • Erstellung des Bildverzeichnisses für die Bücherdatenbank (Benutzer: system)

Erstellung des Bildverzeichnisses

CREATE DIRECTORY IMGDIR AS 'C:\';

Erstellung der Bildtabelle

CREATE TABLE buecher (
    id INTEGER PRIMARY KEY,
    isbn INTEGER,
    titel VARCHAR2(30),
    autor VARCHAR2(30),
    preis INTEGER,
    inhalt VARCHAR2(200),
    foto ORDSYS.ORDImage,
    foto_sig ORDSYS.ORDImageSignature
);

Einfügeprozess

Einfügen eines Buches und Initiierung des Bildelements
DECLARE
    img ORDSYS.ORDImage;
    sig ORDSYS.ORDImageSignature;
    ctx RAW(4000):= NULL;
             
    BEGIN
        INSERT INTO buecher (id, isbn, titel, autor, preis, inhalt, foto, foto_sig)
        VALUES(1, 3544651, 'Java, die Referenz', 'David Flanagan', 60, 'Java-Klassen',
        ORDSYS.ORDImage.init('file', 'IMGDIR', 'Sample.jpg'),
        ORDSYS.ORDImageSignature.init() );
Laden des Bildes und die Generierung der Signatur
SELECT B.foto, B.foto_sig INTO img, sig
FROM buecher B WHERE B.id = 1 FOR UPDATE;
             
img.import(ctx); 
sig.generateSignature(img);
             
UPDATE buecher B
SET B.foto = img,
B.foto_sig = sig
WHERE B.id = 1;
             
END;

Überprüfung der Metadaten

DECLARE
    buch_id Integer; bild ORDSYS.ORDImage; buchtitel varchar2(30);
    getData BOOLEAN;
             
    BEGIN
        SELECT id, titel, foto INTO buch_id, buchtitel, bild FROM buecher
        WHERE id = 1;
        dbms_output.put_line(' Id : ' || buch_id || ' - Titel : '|| buchtitel);
             
        getData := bild.checkProperties();
        IF getData THEN 
            dbms_output.put_line('Höhe: '|| bild.getHeight());
            dbms_output.put_line('Breite: '|| bild.getWidth());
            dbms_output.put_line('MIME-Typ: '|| bild.getMimeType());
            dbms_output.put_line('Dateiformat: '|| bild.getFileFormat());
            dbms_output.put_line('Größe: '|| TO_CHAR(bild.getContentLength()));
        END IF;
    END;

Ähnlichkeitssuche

Deklarierung eines CURSORs
DECLARE
    grenzwert NUMBER;
    vergleich_sig ORDSYS.ORDImageSignature;
    ergebnis_foto ORDSYS.ORDIMAGE;
    id_foto INTEGER;
    titel_foto VARCHAR2(30);
             
    CURSOR rech_fotos IS
    SELECT B.id, B.foto
    FROM buecher B
    WHERE ORDSYS.IMGSimilar(B.foto_sig, vergleich_sig,
    'color="0,6" texture="0,2" shape="0,1" location="0,1"',
    grenzwert)=1;
    BEGIN 
        -- Auswahl des Bildes, das als Vergleichsbasis dient 
        SELECT B.foto_sig INTO vergleich_sig FROM buecher B
        WHERE B.id = 1;
             
        grenzwert := 30.0; 
        -- Ähnlichkeitssuche
        OPEN rech_fotos;
        LOOP
        FETCH rech_fotos INTO id_foto, ergebnis_foto;
        EXIT WHEN rech_fotos%NOTFOUND;
        -- Ausgabe des Ergebnisses
        dbms_output.put_line(id_foto);
        END LOOP;
        CLOSE rech_fotos;
    END;

Kombinierte Abfrage

SELECT Q.id, Q.titel, Q.foto.getCompressionFormat()
    FROM buecher Q, buecher E 
    WHERE E.id=1 AND 
    ORDSYS.IMGSimilar(Q.foto_sig, E.foto_sig, 'color=1', 50.0)=1
    AND Q.foto.getWidth() > 32
    AND Q.foto.getContentLength() > 10000;

2

Auto

Im Folgenden wird ein komplettes Anwendungsbeispiel zur Erläuterung der Funktionalität von interMedia präsentiert. Es wird eine Bücherdatenbank erstellt, die zusätzlich zu Attributen wie ISBN-Nummer, Autor und Preis auch ein Foto des Buches enthält. Nach dem Einfügen eines Buches und der Initiierung des Bildelementes wird die Signatur des Bildes erstellt. Nach der Signaturgenerierung ist es nun möglich, Metadaten wie Höhe, Breite oder Dateiformat des Bildes abzufragen und spezielle Ähnlichkeitsanfragen durchzuführen. Umfangreiche Code-Beispiele beschreiben das praktische Arbeiten mit Oracle interMedia.

Für die Erstellung der Bücherdatenbank muss ein Bildverzeichnis angelegt werden (Benutzer: system):

Erstellung des Bildverzeichnisses

CREATE DIRECTORY IMGDIR AS 'C:\';

Erstellung der Bildtabelle

Im folgenden SQL402-Statement wird eine Tabelle "buecher" angelegt, mit dem Primärschlüssel "id", und mehreren Attributen (isbn, titel, autor, preis, inhalt). Außerdem gibt es ein Attribut "foto", mit dem Datentyp ORDSYS.ORDImage, und die dazugehörige Signatur des Bildes.

Erstellung der Bildtabelle
CREATE TABLE buecher (
    id INTEGER PRIMARY KEY,
    isbn INTEGER,
    titel VARCHAR2(30),
    autor VARCHAR2(30),
    preis INTEGER,
    inhalt VARCHAR2(200),
    foto ORDSYS.ORDImage,
    foto_sig ORDSYS.ORDImageSignature
);

Einfügeprozess

Einfügeprozess:
Methode zum Einfügen des ersten Tupels, zum Laden des Bildes und zur Generierung der Signatur (wird im nächsten Abschnitt fortgesetzt):

Am Beginn werden einige Variablen deklariert, die später für das Importieren des Bildes und die Generierung der Signatur benötigt werden. Außerdem wird der erste Datensatz in die Datenbank eingefügt. Das Bild soll aus dem Bildverzeichnis IMGDIR sein und hat den Namen "Sample.jpg". Durch den Aufruf von ORDImageSignature.init() wird eine Signatur erstellt.

Einfügen eines Buches und Initiierung des Bildelements
DECLARE
    img ORDSYS.ORDImage;
    sig ORDSYS.ORDImageSignature;
    ctx RAW(4000):= NULL;
             
    BEGIN
        INSERT INTO buecher (id, isbn, titel, autor, preis, inhalt, foto, foto_sig)
        VALUES(1, 3544651, 'Java, die Referenz', 'David Flanagan', 60, 'Java-Klassen',
        ORDSYS.ORDImage.init('file', 'IMGDIR', 'Sample.jpg'),
        ORDSYS.ORDImageSignature.init() );
Auto

Durch die folgenden Anweisungen wird das Bild geladen und die dazugehörige Signatur des Bildes generiert.
Zuerst werden die beiden Attribute (foto und foto_sig) des gewünschten Datensatzes für ein Update ausgewählt.

Laden des Bildes und die Generierung der Signatur
SELECT B.foto, B.foto_sig INTO img, sig
FROM buecher B WHERE B.id = 1 FOR UPDATE;
Auto

Danach wird das Bild importiert und die dazugehörige Signatur generiert:

Generierung der Signatur
img.import(ctx); 
sig.generateSignature(img);
Auto

Am Schluss müssen nur noch das importierte Bild und die generierte Signatur des Datensatzes upgedatet werden.

Update
UPDATE buecher B
SET B.foto = img,
B.foto_sig = sig
WHERE B.id = 1;
             
END;

Überprüfung der Metadaten

DECLARE
    buch_id Integer; bild ORDSYS.ORDImage; buchtitel varchar2(30);
    getData BOOLEAN;
             
    BEGIN
        SELECT id, titel, foto INTO buch_id, buchtitel, bild FROM buecher
        WHERE id = 1;
        dbms_output.put_line(' Id : ' || buch_id || ' - Titel : '|| buchtitel);
             
        getData := bild.checkProperties();
        IF getData THEN 
            dbms_output.put_line('Höhe: '|| bild.getHeight());
            dbms_output.put_line('Breite: '|| bild.getWidth());
            dbms_output.put_line('MIME-Typ: '|| bild.getMimeType());
            dbms_output.put_line('Dateiformat: '|| bild.getFileFormat());
            dbms_output.put_line('Größe: '|| TO_CHAR(bild.getContentLength()));
        END IF;
    END;

Ähnlichkeitssuche

Ähnlichkeitssuche:
Zur Ähnlichkeitssuche wird ein Cursor deklariert, der die vorhandenen Datensätze durchlaufen soll und Bilder sucht, die den angegebenen Eigenschaften ähnlich sind (Farbe: 0,6; Textur: 0,2; Form: 0,1; Lage: 0,1). In diesem Beispiel ist also ist die Ähnlichkeit der Merkmale Form und Lage ein wenig wichtiger als die Ähnlichkeit der Farbe. Der Grenzwert gibt an, wie ähnlich die Bilder in ihrer Gesamtheit sein müssen, um in der Ergebnismenge vertreten zu sein. Die Ähnlichkeitsabfrage mit IMGSimilar( ) liefert "1" zurück, falls das Testbild den Ähnlichkeitskriterien entspricht.

Deklarierung eines CURSORs
DECLARE
    grenzwert NUMBER;
    vergleich_sig ORDSYS.ORDImageSignature;
    ergebnis_foto ORDSYS.ORDIMAGE;
    id_foto INTEGER;
    titel_foto VARCHAR2(30);
             
    CURSOR rech_fotos IS
    SELECT B.id, B.foto
    FROM buecher B
    WHERE ORDSYS.IMGSimilar(B.foto_sig, vergleich_sig,
    'color="0,6" texture="0,2" shape="0,1" location="0,1"',
    grenzwert)=1;
Ähnlichkeitssuche (Fortsetzung)

Hier wird ein Bild ausgewählt, das als Vergleichsbasis dienen soll, ein Grenzwert festgesetzt, und dann die Ähnlichkeitssuche durchgeführt. Der zuvor deklarierte Cursor wird jetzt dazu verwendet, um die Datensätze auszuwählen. Als Ergebnis wird die ID der ähnlichen Fotos ausgegeben.

Ähnlichkeitssuche (Fortsetzung)
    BEGIN 
        -- Auswahl des Bildes, das als Vergleichsbasis dient 
        SELECT B.foto_sig INTO vergleich_sig FROM buecher B
        WHERE B.id = 1;
             
        grenzwert := 30.0; 
        -- Ähnlichkeitssuche
        OPEN rech_fotos;
        LOOP
        FETCH rech_fotos INTO id_foto, ergebnis_foto;
        EXIT WHEN rech_fotos%NOTFOUND;
        -- Ausgabe des Ergebnisses
        dbms_output.put_line(id_foto);
        END LOOP;
        CLOSE rech_fotos;
    END;

Kombinierte Abfrage

Bei der kombinierten Abfrage wird die Suche durch mehrere Angaben eingeschränkt. Im folgenden Beispiel wird nicht nur die Ähnlichkeit der Bilder verglichen, sondern auch die Breite des Bildes und die Größe des Bildes werden eingeschränkt:

Kombinierte Abfrage
SELECT Q.id, Q.titel, Q.foto.getCompressionFormat()
FROM buecher Q, buecher E 
WHERE E.id=1 AND 
ORDSYS.IMGSimilar(Q.foto_sig, E.foto_sig, 'color=1', 50.0)=1
AND Q.foto.getWidth() > 32
AND Q.foto.getContentLength() > 10000;
Auto

Einschränkungen der Ergebnismenge können wie gewohnt in der Where-Klausel des SQL-Statements mit UND- oder ODER-Verknüpfung angegeben werden.

Bibliographie

2

Auto

Kos04

Dun03


Notes
(empty)