首页 > 解决方案 > iOS OpenCV:与 ORB 匹配的图像导致 EXC_BAD_ACCESS

问题描述

我是新手OpenCV,我正在尝试将来自相机馈送的图像与提供的应匹配图像的描述符进行匹配。然而,我的 Objective-C++ 代码目前因EXC_BAD_ACCESS而崩溃,这让我相信某些东西已经发布或不存在。我只是找不到罪魁祸首。

我正在为 iOS、Xcode 10.3 和 iOS 12.4 使用 OpenCV 4.1.1

我正在使用 Objective-C++ 与 OpenCV 和 Swift 进行所有与 UI 相关的事情和其他事情。

所以这就是我到目前为止所做的。

我已经设置了包含CvVideoCamera,并且相机图像在UIImageView. (因为这适用于简单的模板匹配,我会用该代码为您省去)

在我OpenCVWrapper.mm这也是 CvVideoCamera 的代表中,我执行以下操作processImage:(cv::Mat&)image;

    CV_Assert(!image.empty());
    cv::ORB *orb = cv::ORB::create();
    cv::Mat descriptors, mask;
    std::vector<cv::KeyPoint> points;
    CV_Assert(!orb->empty());
    orb->detectAndCompute(image, mask, points, descriptors);
    cv::DescriptorMatcher *matcher = cv::DescriptorMatcher::create(cv::BFMatcher::BRUTEFORCE) ;
    std::vector<std::vector<cv::DMatch>> knnMatches;
    NSArray *targetDescriptors = [[self delegate] descriptors];
    for (SourceDescriptor *source in targetDescriptors) {
        matcher->knnMatch(descriptors, source.mat.mat, knnMatches, 2);
        float ratioThreshold = 0.f;
        NSMutableArray *innerDistances = [@[] mutableCopy];
        for (NSInteger counter = 0; counter < knnMatches.size(); counter++) {
            const cv::DMatch& bestMatch = knnMatches[counter][0];
            const cv::DMatch& betterMatch = knnMatches[counter][1];
            float finalDistance = bestMatch.distance / betterMatch.distance;
            if (finalDistance <= ratioThreshold) {
                [innerDistances addObject:[NSNumber numberWithFloat:finalDistance]];
            }
        }
        if ([innerDistances count] > 0) {
            NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO];
            [innerDistances sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];
            Result *leresult = [[Result alloc] init];
            NSNumber *score = (NSNumber *)[innerDistances objectAtIndex:0];
            [leresult setScore:[score floatValue]];
            [leresult setSourceDescriptor:source];
            [result addObject:leresult];
        }
    }

然而,我的代码orb->detectAndCompute()EXC_BAD_ACCESS而崩溃

正如您从代码中看到的那样,我正在检查球体或图像是否为空,但事实并非如此。

任何帮助将不胜感激。

如果需要提供更多信息,我很乐意提供。

标签: c++iosobjective-copencvopencv4

解决方案


推荐阅读