OpenCV BackgroundSubtractorMOG2 算法在作为我的 Swift UI 应用程序的一部分执行时崩溃

OpenCV BackgroundSubtractorMOG2 algorithm crashes when executed as part of my Swift UI app

我正在创建一个 Swift UI 应用程序来处理设备上的图像并使用 OpenCV 库,特别是 BackgroundSubtractor algorithm. I was able to follow the OpenCV iOS guide 并执行基本图像操作,例如拍摄图像,转换为矩阵,使其变灰或使用 OpenCV 函数执行按位运算,但是当我尝试使用 BackgroundSubtractor.apply 方法时,应用程序崩溃并出现 EXC_BAD_ACCESS 错误:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x10455aa40)

这是我的代码:

+ (UIImage *)toMyGreatImage:(UIImage *)source {
    
    Mat sourceMat = [OpenCVWrapper _matFrom:source];
    Mat result;
    
    BackgroundSubtractor *backSub = createBackgroundSubtractorMOG2();
    Mat mask;
    backSub->apply(sourceMat, mask); // crashes here
    return [OpenCVWrapper _imageFrom:mask];
}

只是为了比较,我的其他功能在相同的源图像上工作得很好:

+ (UIImage *)toGray:(UIImage *)source {
    return [OpenCVWrapper _imageFrom:[OpenCVWrapper _grayFrom:[OpenCVWrapper _matFrom:source]]];
}

我还测试了 python 中的背景减法器代码,它按预期工作。我在 iOS 设置中遗漏了什么?

您需要一个“智能指针”来捕获您新创建的 BackgroundSubtractor 实例(不是“原始”实例),否则它会 self-destruct,并在您对无效指针调用方法时崩溃:

cv::Ptr<BackgroundSubtractor> backSub = createBackgroundSubtractorMOG2();

(注意,现在 cv::Ptr 只是 std::shared_ptr 的别名)

(另外,tutorial