ios - OpenCV 加载级联分类器 EXC_BAD_ACCESS 崩溃

标签 ios opencv

我正在使用“官方”opencv2.framework 并且已经设置了包装器和桥接 header 等。我收到 EXC_BAD_ACCESS 消息并在运行应用程序时崩溃。我正在迅速工作。这是包装文件中的代码。

我做错了什么?

#include "OpenCVWrapper.h"
#import "UIImage+OpenCV.h"

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

@implementation OpenCVWrapper : NSObject



+ (UIImage *)processImageWithOpenCV:(UIImage*)inputImage{
Mat mat = [inputImage CVMat];
cv::CascadeClassifier* faceDetector;
// do your processing here
//...

// Load cascade classifier from the XML file
NSString* cascadePath = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2" ofType:@"xml"];

faceDetector->load([cascadePath UTF8String]);

// Load image with face
//UIImage* image = [UIImage imageNamed:@"lena.png"];
Mat faceImage;
faceImage = mat;
Mat grayImage;
cvtColor(faceImage, grayImage, CV_BGR2GRAY);

//Detect faces
std::vector<cv::Rect> faces;
faceDetector->detectMultiScale(grayImage, faces, 1.1, 2,0|CV_HAAR_SCALE_IMAGE, cv::Size(30,30));
//Draw all detected faces
for(unsigned int i = 0; i < faces.size(); i++)
{
    const cv::Rect& face = faces[i];
    //Get top-left and bottom-right corner points
    cv::Point tl(face.x , face.y);
    cv::Point br = tl + cv::Point(face.width,face.height);

    //draw rectangle around the face
    cv::Scalar magenta = cv::Scalar(255,0,255);
    cv::rectangle(faceImage, tl, br, magenta, 4, 8, 0);


    }

    //show resulting image

    return [UIImage imageWithCVMat:faceImage];

}

@end

最佳答案

我相信你做得很好。试试我写的这个包装器。这与你创建一个指向 CascadeClassifier 的指针有关,我不是 C++ 专家,但只是一个快速的谷歌建议 '->' 从指针和 '.' 访问成员变量和方法。从实例访问成员变量和方法。因此,我想这就是您访问错误的原因。我的包装器在我的项目中为我工作。希望它对你有用!

#import <Foundation/Foundation.h>
using namespace cv;
using namespace std;

@interface VJImageProcessingModule : NSObject

+ (void)startCascadeClassifier;
+ (vector<cv::Rect>)faceDetect:(Mat &)image;
+ (void)drawRectanglesOnFacesForImage:(Mat &)image andFacesRect:(vector<cv::Rect>)faces;

@end

#import "VJImageProcessingModule.h"
@implementation VJImageProcessingModule

static NSString *cascade_name = @"haarcascade_frontalface_default";
static NSString *cascade_name2 = @"haarcascade_frontalface_alt";
static NSString *cascade_name3 = @"haarcascade_frontalface_alt2";
static NSString *cascade_name4 = @"haarcascade_frontalface_alt_tree";

static CascadeClassifier cascade_model;

+ (void)startCascadeClassifier
{
NSString *cascade_fp = [[NSBundle mainBundle] pathForResource:cascade_name3 ofType:@"xml"];
cascade_model.load([cascade_fp UTF8String]);
}

+ (vector<cv::Rect>)faceDetect:(Mat &)image
{
if (cascade_model.empty()){[VJImageProcessingModule startCascadeClassifier];};

vector<cv::Rect> faces;
cascade_model.detectMultiScale(image, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(30, 30));

return faces;
}

+ (void)drawRectanglesOnFacesForImage:(Mat &)image andFacesRect:(vector<cv::Rect>)faces
{
    for( int i = 0; i < faces.size(); i++ )
    {
     cv::Point pt1(faces[i].x, faces[i].y);
     cv::Point pt2((faces[i].x + faces[i].height), (faces[i].y + faces[i].width));
     cv::rectangle(image,pt1,pt2, Scalar(255,0,0),3,8,0);
    }
}

@end

关于ios - OpenCV 加载级联分类器 EXC_BAD_ACCESS 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36046031/

相关文章:

c++ - 如何在 OpenCV 中设置 ROI?

c++ - 如何使用 opencv (c++) 分割光滑表面上的异常

iphone - 在特定时间执行某项功能

ios - 打开 Storyboard并执行更新帧后的 Xcode 8.0 布局问题

ios - 如何不从字典中强制转换值

ios - 使用 OpenCV 的简单 IOS 代码可以在模拟器上运行但在真实设备上失败

c++ - 错误 : ‘double’ is not a class, 结构或 union 类型

ios - UITableViewCell subview 不遵守自动布局约束

objective-c - 在单例类 (ARC) 中使用 MKReverseGeocoder

python - 使用kinect深度相机在python中跟踪球