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

来源:互联网 发布:查看电脑的mac地址 编辑:程序博客网 时间:2024/06/08 05:44

第一步:首先去官网下载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错误了。


第三步 :写个测试程序,你可能需要把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 );}

效果如果是这样的

原图:                                                                                    效果图:

 那证明你成功了。

1 0
原创粉丝点击