Multimediální databáze PDB Demonstrační cvičení Koncepty pro sledování chodců
Motivace Business Media streaming / on demand ($) Průmysl CAD/CAM vývoj eVzdělávání Bezpečnost Medicína … Rostoucí trend Abstrakt anglicky
Multimediální databáze Bleskový úvod Podpora pro správu multimediálních dat doplněk tradičních databázových systémů Zaručují konzistenci, souběžnost, integritu Bezpečnost a dostupnost dat Manipulace Dotazování a získávání vysoce relevantních informací z obrovských kolekcí produkovaných dat dle popisu obsahu http://www.fit.vutbr.cz/~chmelarp/pdb/ Abstrakt anglicky
Multimediální data Nestrukturovaná data: Vizuální 2D obrázky 3D modely pohyblivé obrázky Dokumenty Audio Kombinace METADATA Exif, ID3, DICOM, MPEG-7… Abstrakt anglicky
Oracle® interMedia www.oracle.com/technology/products/intermedia/
Oracle® interMedia Rozšíření DB pro uchování, správu a dotazování obrázků, audia, videa a podobných pro libovolné aplikace Podporuje většinu formátů (JPEG, MPEG, QT, RM, …) Manipulace, zpracování obrazu, komprese Pro vývoj aplikací JDeveloper - ADF/UIX, Swing Application server - Servlet / JSP PL/SQL, Oracle Portal Streaming server (RealMedia, MS), … Rozšiřitelný (o zpracování řeči) www.oracle.com/technology/
Oracle® interMedia obsahuje Zdroj MM + umístění v tabulce (pod transakční kontrolou) na disku, webu, jinde (metainformace) Formát MM velikost, délka, rozlišení, komprese, … Metadata autor, copyright, popis datum, způsob pořízení Exif, IPTC-IIM, DICOM, XMP, libovolné XML U statických obrázků popis obsahu www.oracle.com/pls/db102/portal.portal_db?selected=7
Signature pro správu obsahu obrázků Barva Tvar Textura Umístění Signature (3-4kB) je vyrobené segmentací barvy, …
Prerekvizity JDBC SQLJ JDeveloper www.oracle.com/technology/sample_code/products/intermedia/
Oracle JDeveloper Poslední stabilní, plná, verze Neinstaluje se Registrace (není pro teroristy :) www.oracle.com/technology/software/products/jdev/ SQL Developer www.oracle.com/technology/software/products/sql/ Připojení Oracle Database 10g host: pcuifs1.fit.vutbr.cz port: 1521 SID: stud password = login
JDBC připojení set CLASSPATH=%ORACLE_HOME%\jdbc\lib\ojdbc14.jar; %ORACLE_HOME%\sqlj\lib\runtime12.jar; import java.sql.Connection; import java.sql.SQLException; import java.sql.DriverManager; import java.sql.Statement; import java.sql.PreparedStatement; import java.sql.ResultSet; import oracle.jdbc.OracleResultSet; import oracle.jdbc.OraclePreparedStatement; // register the oracle jdbc driver with the JDBC driver manager DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); // connect pcuifs1.fit.vutbr.cz Connection conn = DriverManager.getConnection("jdbc:oracle:thin:login/password" + "@pcuifs1.fit.vutbr.cz:1521:stud" ); // note: set the autocommit to false for BLOBs (2-phase select-commit). conn.setAutoCommit(false); // create a JDBC Statement object to execute SQL in the database Statement stmt = conn.createStatement();
ORDImage OrdImage je objekt, (lepší než) BLOB Společný MM import oracle.ord.im.OrdImage; import oracle.ord.im.OrdImageSignature; set CLASSPATH=%ORACLE_HOME%\ord\jlib\ordim.jar; OrdImage je objekt, (lepší než) BLOB Společný MM
ORDSYS.ORDImage (DB) a OrdImage (Java) objekt OrdImage je Java objekt OrdImage je proxy pro databázový objekt Musí být vytvořeno z databázového ORDSYS.ORDImage, všechny operace provádí databáze
Vkládání obrázků do databáze CREATE TABLE image_table (id number primary key, image ordsys.ordimage, signature ordsys.ordimagesignature); CREATE SEQUENCE image_sequence INCREMENT BY 1 START WITH 1;
Vložení obrázku 1 // retrieve the next value in the sequence order String SQLquery = "SELECT image_sequence.nextval FROM dual"; OracleResultSet rset = (OracleResultSet)stmt.executeQuery(SQLquery); rset.next(); int nextval = rset.getInt("nextval"); // insert a row (nextval, initialized ORDImage) into image_table SQLquery = "INSERT INTO image_table (id, image, signature) VALUES (" + nextval + ", ordsys.ordimage.init(), ordsys.ordimagesignature.init())"; stmt.execute(SQLquery); // select the new ORDImage into a java proxy OrdImage object (imageProxy) // Note: for update (we will be uploading data into the ORDImage’s BLOB) String rowSelectSQL = "SELECT image, signature FROM image_table WHERE id = " + nextval + " FOR UPDATE"; rset = (OracleResultSet)stmt.executeQuery(rowSelectSQL); OrdImage imageProxy = (OrdImage)rset.getCustomDatum("image", OrdImage.getFactory()); // (OrdImage)rset.getORAData("image", OrdImage.getORADataFactory()); OrdImageSignature signatureProxy = (OrdImageSignature)rset.getCustomDatum("signature", OrdImageSignature.getFactory()); rset.close();
Vložení obrázku 2 // load the image data from the goats.gif file into the ORDImage object // Note: and by extension into the database :-) imageProxy.loadDataFromFile(fileName); // automatically detect the image’s height, width, file format, and so on // Note: the proxy object forwards the request to the database to execute ORDImage.setProperties() on the server imageProxy.setProperties(); // generate an image signature for the specified image signatureProxy.generateSignature(imageProxy); String updateSQL = "UPDATE image_table SET image=?, signature=? where id=" + nextval; OraclePreparedStatement opstmt = (OraclePreparedStatement)conn.prepareStatement(updateSQL); opstmt.setCustomDatum(1, imageProxy); opstmt.setCustomDatum(2, signatureProxy); opstmt.execute(); opstmt.close(); // commit all our changes conn.commit();
Manipulace a vlastnosti obrázku // see slide "Vlození obrázku 2" imageProxy.setProperties(); // the image is selected into a proxy object (imageProxy), and then getXY methods are called. String rowSelectSQL = "select image from image_table where id = 1"; OracleResultSet rset = (OracleResultSet)stmt.executeQuery(rowSelectSQL); rset.next(); OrdImage imageProxy = (OrdImage)rset.getORAData("image", OrdImage.getORADataFactory()); rset.close(); int height = imageProxy.getHeight(); int width = imageProxy.getWidth();
Konverze obrázků String rowInsertSQL = ("insert into image_table (id, image) " + "values (2, ordsys.ordimage.init())"); // get the source ORDImage object String srcSelectSQL = "select image from image_table where id=1"; ... OrdImage srcImageProxy = (OrdImage)rset.getORAData("image", OrdImage.getORADataFactory()); // get the newly inserted destination ORDImage object String dstSelectSQL = "select image from image_table where id=2 for update"; OrdImage dstImageProxy = (OrdImage)rset.getORAData("image", OrdImage.getORADataFactory()); // call the processCopy method (processing occurs on the SERVER) srcImageProxy.processCopy("maxscale=100 100 fileformat=jfif", dstImageProxy); // update the destination image in the second row String dstUpdateSQL = "update image_table set image=? where id=2"; opstmt.setORAData(1, dstImageProxy); // commit download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14297/toc.htm
Download Mazání je obyčejné SQL // export the data in row 2 String exportSelectSQL = "select image from image_table where id = 2"; OracleResultSet rset = (OracleResultSet)stmt.executeQuery(exportSelectSQL); // get the proxy for the image in row 2 rset.next(); OrdImage imageProxy = (OrdImage)rset.getORAData("image", OrdImage.getORADataFactory()); rset.close(); // call the getDataInFile method to write the ORDImage in row 2 to disk imageProxy.getDataInFile("row2.jpg"); Mazání je obyčejné SQL DELETE FROM image_table // restore database to its original state - drop image table and sequence stmt.executeQuery("DROP TABLE image_table"); stmt.executeQuery("DROP SEQUENCE image_sequence"); // commit all our changes conn.commit();
Ukázka 1 (www.fit.vutbr.cz/~chmelarp/pdb/)
Dotazování médií import oracle.ord.im.OrdAudio; import oracle.ord.im.OrdDoc; import oracle.ord.im.OrdImage; import oracle.ord.im.OrdVideo; String query = "select product_photo, product_audio," + " product_video, product_testimonials from" + " pm.online_media where product_id=3117"; PreparedStatement pstmt = conn.prepareStatement(query); OracleResultSet rset = (OracleResultSet)pstmt.executeQuery(); if ( rset.next() ) { OrdImage imgProxy = (OrdImage)rset.getORAData( "product_photo", OrdImage.getORADataFactory()); OrdAudio audProxy = (OrdAudio)rset.getORAData( "product_audio", OrdAudio.getORADataFactory()); OrdVideo vidProxy = (OrdVideo)rset.getORAData( "product_video", OrdVideo.getORADataFactory()); OrdDoc docProxy = (OrdDoc)rset.getORAData( "product_testimonials", OrdDoc.getORADataFactory()); } String audFormat = audProxy.getFormat(); String vidMimetype = vidProxy.getMimeType();
Doručování médií (Servlet) Je možné použít třídy OrdHttpResponseHandler nebo OrdHttpJspResponsehandler pro doručení HTTP klientovi. import oracle.ord.im.OrdHttpResponseHandler; protected void doGet(HttpServletRequest reqest, HttpServletResponse response) throws ServletException, java.io.IOException { // obtain oracle.ord.im.OrdImage object // imgProxy follows the Section "Media Retrieval in Java" ... // deliver the image data to the browser OrdHttpResponseHandler handler = new OrdHttpResponseHandler(request, response); handler.sendImage(imgProxy); }
Upload médií (JSP) <!-- HTML FORM --> <form action="upload.jsp" method="post" enctype="multipart/form-data"> id: <input type="text" name="id"/> description: <input type="text" name="description"/> Photo: <input type="file" name="photo"/> </form> // JSP import // <%@ page import="oracle.ord.im.OrdHttpUploadFormData" %> // <%@ page import="oracle.ord.im.OrdHttpUploadFile" %> // In JSP als nächstes folgt muß in den <% %> sein :) OrdHttpUploadFormData formData = new OrdHttpUploadFormData( request ); formData.parseFormData(); // Get the description, location, and photo. String id = formData.getParameter( "id" ); String description = formData.getParameter( "description" ); OrdHttpUploadFile photo = formData.getFileParameter( "photo" ); ... formData.release(); photo.loadImage(imgProxy); // und so veiter update photo... download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14302/ch_websrvtier.htm#sthref135
Ukázka 2 (www.fit.vutbr.cz/~chmelarp/pdb/)
Podobnostní vyhledávání download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14302/ch_cbr.htm
Vyhledávání dle obsahu Doporučuji používat IMGSimilar a IMGScore raději než evaluateScore a isSimilar následujícím způsobem: SELECT img1.id, img2.id, ORDSYS.IMGScore(123) as distance FROM image_table img1, image_table img2 WHERE ORDSYS.IMGSimilar(img1.signature, img2.signature, 'color="0.3" texture="0.3" shape="0.3" location="0.1"', 100, 123) = 1 AND img1.id <> img2.id AND img1.id = 1 ORDER BY distance Protože je možné použít index: CREATE INDEX image_index ON image_table(signature) INDEXTYPE IS ordsys.ordimageindex PARAMETERS ('ORDImage_Filter_Tablespace = USER1, ORDImage_Index_Tablespace = USER2') download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14297/ch_imgref.htm
Literatura k projektu Stránky předmětu PDB Sklad projektu PDB http://www.fit.vutbr.cz/~chmelarp/pdb/ Oracle Technology Network www.oracle.com/technology/ interMedia Documentation www.oracle.com/pls/db102/portal.portal_db?selected=7 interMedia Sample Applications www.oracle.com/technology/sample_code/products/intermedia/ … http://java.sun.com/javase/6/docs/technotes/guides/imageio/ JAI, JMF, …
Dotazy… ? Organizace projektů… Děkuji. ctrl + S