0

OnCameraFrame現在のフレームのキーポイントをチェックし、テンプレート画像のキーポイントとの適切な一致を見つけようとするネイティブ メソッドを呼び出し、どのインデックス付き画像が最も適切に一致するかを計算し、インデックスを返します。(物体認識アプリです)。問題は、動作が非常に遅く (3 ~ 4 fps、このメソッドを完了するのに 0.3 秒かかる)、10 ~ 20 フレーム後にSIGSEGV code=1エラーでクラッシュすることです。これはおそらくメモリ不足の問題だと思いますが、コードのどの部分がすべての RAM を消費しているのかわかりません。お役に立てれば幸いです。

JNIEXPORT jint JNICALL  Java_org_opencv_samples_tutorial2_Tutorial2Activity_processImage(
    JNIEnv* env, jlong frameAddress) {


Mat& image = *(Mat*) frameAddress;

cv::OrbFeatureDetector detector(100);
cv::OrbDescriptorExtractor extractor;
std::vector<cv::KeyPoint> queryKeypoints;

detector.detect(image, queryKeypoints);

Mat queryDescriptors;
extractor.compute(image, queryKeypoints, queryDescriptors);

queryDescriptors.convertTo(queryDescriptors, CV_32F);

vector < DMatch > matches;
flannMatcher.match(queryDescriptors, matches);


double max_dist = 0;
double min_dist = 100;

std::vector < DMatch > good_matches;

for (int i = 0; i < matches.size(); i++) {
    if (matches[i].distance <= max(2 * min_dist, 0.02)) {
        good_matches.push_back(matches[i]);
    }
}

int * gmatchIndexes;
gmatchIndexes = new int[good_matches.size()];

for (int i = 0; i < good_matches.size(); i++) {
    gmatchIndexes[i] = -1;
}
for (int kk = 0; kk < good_matches.size(); kk++) {

    gmatchIndexes[good_matches[kk].imgIdx]++;

}


int maxIdx = -1;
for (int i = 0; i < good_matches.size(); i++) {
    if (gmatchIndexes[i] > maxIdx) {
        maxIdx = i;
    }
}

int* p_answer = &maxIdx;
int answer = *p_answer;

//if (gmatchIndexes[maxIdx] > 2) {
image.release();
vector<DMatch>().swap(matches);
vector<DMatch>().swap(good_matches);
delete[] gmatchIndexes;
queryDescriptors.release();

return answer;

}

編集:コードにリリース/削除を追加しましたが、今では次のようなエラーが発生 @@@ ABORTING: INVALID HEAP ADDRESS IN dlfreeします:0: gralloc_module_lock: Cannot lock buffer ID=55438 before register (0x0)

4

1 に答える 1

0

そのようにframeAddressを使用することはできないと思います。代わりに、GetByteArrayElements/ReleaseByteArrayElements を使用して、データへの実際のポインターを取得する (そして適切な型の Mat を構築する) 必要があります。例: http://ruckus.tumblr.com/post/18055652108/writing-a-basic-image-filter-in-android-using-ndk

于 2015-01-19T16:04:06.323 に答える