Ошибка Out Of Memory в JNI с использованием OpenCV OnCameraFrame

Я называю нативный метод в моем OnCameraFrame это проверяет ключевые точки текущего кадра и пытается найти хорошие совпадения с ключевыми точками шаблонных изображений, вычисляет, какое индексированное изображение имеет наиболее хорошие совпадения, и возвращает индекс. (это приложение для распознавания объектов). Проблема в том, что он работает очень медленно (3-4 кадра в секунду, для завершения этого метода требуется 0,3 секунды), а после 10-20 кадров происходит сбой SIGSEGV code=1 ошибка. Я понимаю, что это, вероятно, проблема нехватки памяти, но не могу понять, какая часть кода потребляет всю оперативную память. Надеюсь, вы можете помочь.

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)

0

Решение

Я думаю, что вы не можете использовать frameAddress таким образом. Вместо этого вы должны использовать GetByteArrayElements / ReleaseByteArrayElements, чтобы получить фактический указатель на ваши данные (и построить Mat соответствующего типа). Например: http://ruckus.tumblr.com/post/18055652108/writing-a-basic-image-filter-in-android-using-ndk

0

Другие решения


По вопросам рекламы [email protected]