Wednesday 15 February 2012

java - Is there a way of storing Opencv/javacv Mat objects in a database? -



java - Is there a way of storing Opencv/javacv Mat objects in a database? -

after reading endless documents , trying understand examples opencv/javacv extracting keypoints, computing features descriptorextractors match input image against bunch of images see if input image 1 of them or part of 1 of images, think, should storing mat objects after computing them.

i utilize emily webb's code example:

string smallurl = "rsz_our-mobile-planet-us-infographic_infographics_lg_unberela.jpg"; string largeurl = "our-mobile-planet-us-infographic_infographics_lg.jpg";

iplimage image = cvloadimage(largeurl,cv_load_image_unchanged ); iplimage image2 = cvloadimage(smallurl,cv_load_image_unchanged ); cvmat descriptorsa = new cvmat(null); cvmat descriptorsb = new cvmat(null); final fastfeaturedetector ffd = new fastfeaturedetector(40, true); final keypoint keypoints = new keypoint(); final keypoint keypoints2 = new keypoint(); ffd.detect(image, keypoints, null); ffd.detect(image2, keypoints2, null); system.out.println("keypoints.size() : "+keypoints.size()); system.out.println("keypoints2.size() : "+keypoints2.size()); // brisk extractor = new brisk(); //briefdescriptorextractor extractor = new briefdescriptorextractor(); freak extractor = new freak(); extractor.compute(image, keypoints, descriptorsa); extractor.compute(image2, keypoints2, descriptorsb); system.out.println("descriptorsa.size() : "+descriptorsa.size()); system.out.println("descriptorsb.size() : "+descriptorsb.size()); dmatch dmatch = new dmatch(); //flannbasedmatcher matcher = new flannbasedmatcher(); //descriptormatcher matcher = new descriptormatcher(); bfmatcher matcher = new bfmatcher(); matcher.match(descriptorsa, descriptorsb, dmatch, null); system.out.println(dmatch.capacity());

my question : how can store descriptorsa (or descriptorsb) in db --in java implementation of opencv- ? (they mat objects obtained after extractor.compute(image, keypoints, descriptorsa); )

i aware of fact mat objects not serializable objects in java implementation surely, if want match image against set of archive images, have extract descriptors of archive , store them feature use..

after more search have found links in http://answers.opencv.org/question/8873/best-way-to-store-a-mat-object-in-android/

although answers android devices , referring before questions saving keypoints ( saving orb feature vectors using opencv4android (java api)), reply "from mat object xml , xml mat object" in code below seems working:

import org.opencv.core.cvtype; import org.opencv.core.mat; import org.w3c.dom.document; import org.w3c.dom.element; import org.w3c.dom.node; import org.w3c.dom.nodelist; import javax.xml.parsers.documentbuilderfactory; import javax.xml.transform.outputkeys; import javax.xml.transform.transformer; import javax.xml.transform.transformerfactory; import javax.xml.transform.dom.domsource; import javax.xml.transform.stream.streamresult; import java.io.file; import java.util.locale; import java.util.scanner; public class tafilestorage { // static public static final int read = 0; public static final int write = 1; // varaible private file file; private boolean iswrite; private document doc; private element rootelement; public tafilestorage() { file = null; iswrite = false; doc = null; rootelement = null; } // read or write public void open(string filepath, int flags ) { seek { if( flags == read ) { open(filepath); } else { create(filepath); } } catch(exception e) { e.printstacktrace(); } } // read public void open(string filepath) { seek { file = new file(filepath); if( file == null || file.isfile() == false ) { system.err.println("can not open file: " + filepath ); } else { iswrite = false; doc = documentbuilderfactory.newinstance().newdocumentbuilder().parse(file); doc.getdocumentelement().normalize(); } } catch(exception e) { e.printstacktrace(); } } // write public void create(string filepath) { seek { file = new file(filepath); if( file == null ) { system.err.println("can not wrtie file: " + filepath ); } else { iswrite = true; doc = documentbuilderfactory.newinstance().newdocumentbuilder().newdocument(); rootelement = doc.createelement("opencv_storage"); doc.appendchild(rootelement); } } catch(exception e) { e.printstacktrace(); } } public mat readmat(string tag) { if( iswrite ) { system.err.println("try read file write flags"); homecoming null; } nodelist nodelist = doc.getelementsbytagname(tag); mat readmat = null; for( int = 0 ; i<nodelist.getlength() ; i++ ) { node node = nodelist.item(i); if( node.getnodetype() == node.element_node ) { element element = (element)node; string type_id = element.getattribute("type_id"); if( "opencv-matrix".equals(type_id) == false) { system.out.println("fault type_id "); } string rowsstr = element.getelementsbytagname("rows").item(0).gettextcontent(); string colsstr = element.getelementsbytagname("cols").item(0).gettextcontent(); string dtstr = element.getelementsbytagname("dt").item(0).gettextcontent(); string datastr = element.getelementsbytagname("data").item(0).gettextcontent(); int rows = integer.parseint(rowsstr); int cols = integer.parseint(colsstr); int type = cvtype.cv_8u; scanner s = new scanner(datastr); s.uselocale(locale.us); if( "f".equals(dtstr) ) { type = cvtype.cv_32f; readmat = new mat( rows, cols, type ); float fs[] = new float[1]; for( int r=0 ; r<rows ; r++ ) { for( int c=0 ; c<cols ; c++ ) { if( s.hasnextfloat() ) { fs[0] = s.nextfloat(); } else { fs[0] = 0; system.err.println("unmatched number of float value @ rows="+r + " cols="+c); } readmat.put(r, c, fs); } } } else if( "i".equals(dtstr) ) { type = cvtype.cv_32s; readmat = new mat( rows, cols, type ); int is[] = new int[1]; for( int r=0 ; r<rows ; r++ ) { for( int c=0 ; c<cols ; c++ ) { if( s.hasnextint() ) { is[0] = s.nextint(); } else { is[0] = 0; system.err.println("unmatched number of int value @ rows="+r + " cols="+c); } readmat.put(r, c, is); } } } else if( "s".equals(dtstr) ) { type = cvtype.cv_16s; readmat = new mat( rows, cols, type ); short ss[] = new short[1]; for( int r=0 ; r<rows ; r++ ) { for( int c=0 ; c<cols ; c++ ) { if( s.hasnextshort() ) { ss[0] = s.nextshort(); } else { ss[0] = 0; system.err.println("unmatched number of int value @ rows="+r + " cols="+c); } readmat.put(r, c, ss); } } } else if( "b".equals(dtstr) ) { readmat = new mat( rows, cols, type ); byte bs[] = new byte[1]; for( int r=0 ; r<rows ; r++ ) { for( int c=0 ; c<cols ; c++ ) { if( s.hasnextbyte() ) { bs[0] = s.nextbyte(); } else { bs[0] = 0; system.err.println("unmatched number of byte value @ rows="+r + " cols="+c); } readmat.put(r, c, bs); } } } } } homecoming readmat; } public void writemat(string tag, mat mat) { seek { if( iswrite == false) { system.err.println("try write file no write flags"); return; } element matrix = doc.createelement(tag); matrix.setattribute("type_id", "opencv-matrix"); rootelement.appendchild(matrix); element rows = doc.createelement("rows"); rows.appendchild( doc.createtextnode( string.valueof(mat.rows()) )); element cols = doc.createelement("cols"); cols.appendchild( doc.createtextnode( string.valueof(mat.cols()) )); element dt = doc.createelement("dt"); string dtstr; int type = mat.type(); if(type == cvtype.cv_32f ) { // type == cvtype.cv_32fc1 dtstr = "f"; } else if( type == cvtype.cv_32s ) { // type == cvtype.cv_32sc1 dtstr = "i"; } else if( type == cvtype.cv_16s ) { // type == cvtype.cv_16sc1 dtstr = "s"; } else if( type == cvtype.cv_8u ){ // type == cvtype.cv_8uc1 dtstr = "b"; } else { dtstr = "unknown"; } dt.appendchild( doc.createtextnode( dtstr )); element info = doc.createelement("data"); string datastr = datastringbuilder( mat ); data.appendchild( doc.createtextnode( datastr )); // append matrix matrix.appendchild( rows ); matrix.appendchild( cols ); matrix.appendchild( dt ); matrix.appendchild( info ); } catch(exception e) { e.printstacktrace(); } } private string datastringbuilder(mat mat) { stringbuilder sb = new stringbuilder(); int rows = mat.rows(); int cols = mat.cols(); int type = mat.type(); if( type == cvtype.cv_32f ) { float fs[] = new float[1]; for( int r=0 ; r<rows ; r++ ) { for( int c=0 ; c<cols ; c++ ) { mat.get(r, c, fs); sb.append( string.valueof(fs[0])); sb.append( ' ' ); } sb.append( '\n' ); } } else if( type == cvtype.cv_32s ) { int is[] = new int[1]; for( int r=0 ; r<rows ; r++ ) { for( int c=0 ; c<cols ; c++ ) { mat.get(r, c, is); sb.append( string.valueof(is[0])); sb.append( ' ' ); } sb.append( '\n' ); } } else if( type == cvtype.cv_16s ) { short ss[] = new short[1]; for( int r=0 ; r<rows ; r++ ) { for( int c=0 ; c<cols ; c++ ) { mat.get(r, c, ss); sb.append( string.valueof(ss[0])); sb.append( ' ' ); } sb.append( '\n' ); } } else if( type == cvtype.cv_8u ) { byte bs[] = new byte[1]; for( int r=0 ; r<rows ; r++ ) { for( int c=0 ; c<cols ; c++ ) { mat.get(r, c, bs); sb.append( string.valueof(bs[0])); sb.append( ' ' ); } sb.append( '\n' ); } } else { sb.append("unknown type\n"); } homecoming sb.tostring(); } public void release() { seek { if( iswrite == false) { system.err.println("try release of file no write flags"); return; } domsource source = new domsource(doc); streamresult result = new streamresult(file); // write xml file transformer transformer = transformerfactory.newinstance().newtransformer(); transformer.setoutputproperty(outputkeys.indent, "yes"); // transformer.transform(source, result); } catch(exception e) { e.printstacktrace(); } } }

java serialization javacv

No comments:

Post a Comment