使用 OpenCV OnCameraFrame 在 JNI 中出现内存不足崩溃

Out Of Memory crash in JNI using OpenCV OnCameraFrame

本文关键字:内存不足 崩溃 JNI OpenCV OnCameraFrame 使用      更新时间:2023-10-16

我在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)等错误

我认为你不能以这种方式使用frameAddress。相反,您应该使用 GetByteArrayElements/ReleaseByteArrayElements 来获取指向数据的实际指针(并构造适当类型的 Mat)。例如:http://ruckus.tumblr.com/post/18055652108/writing-a-basic-image-filter-in-android-using-ndk