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)
我正在创建一个 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)