如何从零开始搭建openCV IOS 工程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x32sky/article/details/51649554

第一步:首先去官网下载ios  framwork ,人家编辑好的包,直接用很方便,链接:http://opencv.org/downloads.html  

注意:opencv 3.0版本是beta版本,不稳定还缺少很多必要的库,请下载2.0以后,3.0以前版本,我下载的是2.4.13,16年5月19版本


第二步:下载的库直接可以拖到工程里,并且要添加以下framework:


添加以后这时候你build一下如果发现编译不过,出现了一个很蛋疼的错误缺少一个libjpg库,不要惊慌,请按照以下步骤;

 http://sourceforge.net/projects/libjpeg-turbo/files/1.4.0/ 下载 libjpeg-turbo-1.4.0.dmg

安装这个库,然后你会在路径/opt/libjpeg-turbo/lib找到它libjpeg.a

打开终端输入 lipo -info /opt/libjpeg-turbo/lib/libjpeg.a 看是不是armv7 x86-64都全,然后把这个.a拷贝到你的工程目录下

然后把库拖进你的工程里 ,然后编译,就没有link错误了。

扫描二维码关注公众号,回复: 3773726 查看本文章


第三步 :写个测试程序,你可能需要把Mat类型转UIImage 

//
//  openUtil.h
//  targetRecognition
//
//  Created by x32 on 16/5/29.
//  Copyright © 2016年 x32. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface openUtil : NSObject

+(cv::Mat)cvMatFromUIImage:(UIImage *)image;

+(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat;
@end


//
//  openUtil.m
//  targetRecognition
//
//  Created by x32 on 16/5/29.
//  Copyright © 2016年 x32. All rights reserved.
//

#import "openUtil.h"

@implementation openUtil


+ (cv::Mat)cvMatFromUIImage:(UIImage *)image
{
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
    CGFloat cols = image.size.width;
    CGFloat rows = image.size.height;
    
    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)

    
    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to  data
                                                    cols,                       // Width of bitmap
                                                    rows,                       // Height of bitmap
                                                    8,                          // Bits per component
                                                    cvMat.step[0],              // Bytes per row
                                                    colorSpace,                 // Colorspace
                                                    kCGImageAlphaNoneSkipLast |
                                                    kCGBitmapByteOrderDefault); // Bitmap info flags
    
    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
    CGContextRelease(contextRef);
    
    return cvMat;
}


+(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
{
    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
    CGColorSpaceRef colorSpace;
//    CGBitmapInfo bitmapInfo;
    
    if (cvMat.elemSize() == 1) {
        colorSpace = CGColorSpaceCreateDeviceGray();
    } else {
        colorSpace = CGColorSpaceCreateDeviceRGB();
    }
    
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
    
    // Creating CGImage from cv::Mat
    CGImageRef imageRef = CGImageCreate(cvMat.cols,                                 //width
                                        cvMat.rows,                                 //height
                                        8,                                          //bits per component
                                        8 * cvMat.elemSize(),                       //bits per pixel
                                        cvMat.step[0],                            //bytesPerRow
                                        colorSpace,                                 //colorspace
                                        kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
                                        provider,                                   //CGDataProviderRef
                                        NULL,                                       //decode
                                        false,                                      //should interpolate
                                        kCGRenderingIntentDefault                   //intent
                                        );
    
    
    // Getting UIImage from CGImage
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);
    
    return finalImage;
}


@end


写个viewcontroller  里面显示一个UIImageView 引用一堆头文件 找张图片用以下程序测试一下

#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/core.hpp>
#import <opencv2/features2d.hpp>
#import <opencv2/calib3d.hpp>
#import <opencv2/objdetect.hpp>
#import <opencv2/nonfree/nonfree.hpp>
#import <opencv2/highgui.hpp>
#import <opencv2/imgproc.hpp>
#import <opencv2/objdetect/objdetect.hpp>

@property (weak, nonatomic)  UIImageView *imgView;

-(void)corrosionPic
{
    UIImage* image=[UIImage imageNamed:@"1.jpg"];
    cv::Mat srcImage = [openUtil cvMatFromUIImage:image];
    cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));
    cv::Mat dstImage;
    cv::erode(srcImage, dstImage, element);
    UIImage *dstImg = [openUtil UIImageFromCVMat:dstImage];

    self.imgView.image =dstImg;
    self.view.backgroundColor = [UIColor blackColor];
    
    //cv::Mat srcImage1 = cv::imread( "1.jpg", 1 );
}

效果如果是这样的

原图:                                                                                    效果图:

 那证明你成功了。

猜你喜欢

转载自blog.csdn.net/x32sky/article/details/51649554