如何在 iOS 工程中使用 OpenCV
发布网友
发布时间:2022-05-07 00:01
我来回答
共1个回答
热心网友
时间:2023-10-09 01:53
第一步:首先去官网下载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
[objc] view plain copy print?
//
// 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
[objc] view plain copy print?
//
// 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
88 * 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 引用一堆头文件 找张图片用以下程序测试一下
[objc] view plain copy print?
#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 );
}