2

ランダムな OpenCV 記述子エクストラクタによって生成された記述子マトリックスをデータベース エンティティとして保存したいと考えています。

des が記述子 Matrix であると仮定します

String s = (desc.reshape(1,1)).dump;

データベースからマトリックスを取得するために、私はやった

Mat desc = new Mat(numberOfRows * numberOfCols * numberOfChannels, 1, type);
/* I stored number of rows and number of cols and type of the matrix separately and pass them to the function that returns the matrix */
String ss[] = s.substring(1, s.length -1).split(", ");
int[] temp = new int[sss.length ];
for(int i = 0; i < sss.length; i++) temp [i] = Integer.parseInt(sss[i]);
MatOfInt int_values = new MatOfInt(temp);
int_values.convertTo(desc, type);
desc = fingerprint.desc(numberOfChannels, numberOfRows);

これは問題なく動作しますが、特に .split メソッドと、マトリックス内の要素数が多いため parseInt を含むループ (私の場合は約 100k) に多くの時間がかかります。

私の質問は次のとおりです。これを行うためのより良い方法はありますか?

私の2番目の質問は、さあ、100Kの長い文字列配列を割り当てて解析することです(文字列が実際には最大で2〜3文字であるという事実を考えると)、Android/Javaが遅いため、実際には2秒かかるべきではありません

4

2 に答える 2

3

OpenCV はリンクFileStorageのように永続化のためのクラスを提供します。基本的に、画像は後で読み取ることができる XML/YAML ファイルとして保存できます。簡単な例は以下のようになります。Mat

//for writing
cv::FileStorage store(“save.yml", cv::FileStorage::WRITE);
store << “mat” << img;
store.release();

//for reading
cv::FileStorage store(“save.yml", cv::FileStorage::READ);
store[“mat”] >> img;
store.release();

FileStorageしかし、Android には Java ラッパーがありません。別の方法として、この例のように JNI を介して上記のコードを呼び出すか、Berak のサンプルを確認してください。

于 2014-12-12T04:59:38.510 に答える