2016-03-16 2 views
1

Я использую «официальную» opencv2.framework и уже настроил обертки и заголовок заголовка и т. Д. Я получаю сообщение EXC_BAD_ACCESS и сбой при запуске приложения. Я работаю быстро. вот код из файла-обертки.Загрузка с помощью OpenCV cascadeClassifier EXC_BAD_ACCESS crash

Что я делаю неправильно?

#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 
+0

Во-первых, вы работаете в Objective C. Во-вторых, что говорит ваша ошибка? – sschale

ответ

2

Я надеюсь, что у вас все хорошо. Попробуйте эту обертку, которую я написал. Это связано с тем, что вы создаете указатель на CascadeClassifier, и я не C++ boffin, но только быстрый google предлагает, чтобы '->' обращался к переменным-членам и методам от указателя и '.' получает доступ к переменным-членам и методам из экземпляра. Следовательно, я хотел бы думать, что это причина вашей плохой ошибки доступа. Моя обложка работает для меня в моем проекте. Надеюсь, это сработает для вас!

#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