demo地址:https://github.com/GoldenRocking/OpenCV_iOS
OpenCV是一個(gè)開(kāi)源的計(jì)算機(jī)視覺(jué)庫(kù)立倍。OpenCV采用C/C++語(yǔ)言編寫希太。關(guān)于OpenCV的簡(jiǎn)單介紹,會(huì)在下一節(jié)講到。這一節(jié)主要介紹如何在iOS平臺(tái)調(diào)用OpenCV函數(shù)男公。
首先耙考,我們需要到OpenCV官網(wǎng)下載其framework:http://opencv.org/downloads.html;
下載好opencv2.framework后艾岂,我們便可以將其引入xcode工程顺少。
在用OpenCV處理圖像以前,我們首先要做的的是先將UIImage格式的圖片轉(zhuǎn)換為cvMat的數(shù)據(jù)類型:
+(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;
}
openCV可以通過(guò)其相關(guān)的函數(shù)來(lái)處理cvMat 數(shù)據(jù)王浴。處理結(jié)束之后脆炎,我們需要將cvMat 數(shù)據(jù)轉(zhuǎn)化為UIImage格式:
+(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorSpace;
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;
}
我們可以創(chuàng)建一個(gè)PrefixHeader.pch文件,在工程的Build Settings->Prefix Header中將其引入:
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
#endif /* PrefixHeader_pch */
這樣就不需要每次在ViewController中導(dǎo)入頭文件了氓辣。
由于OpenCV是用C++所寫秒裕,所以我們?cè)谝玫牡胤叫枰獙?m文件修改為.mm。為了方便使用庫(kù)函數(shù)钞啸,我們可以在調(diào)用的類中添加如下代碼:
using namespace cv;
下面是一個(gè)簡(jiǎn)單的圖像灰度處理方法的調(diào)用:
UIImage *image = [UIImage imageNamed:@"timg"];
Mat mat = [cvprocess cvMatFromUIImage:image];
Mat grayMat;
cvtColor(mat, grayMat, CV_BGR2GRAY);
UIImage *cvimage = [cvprocess UIImageFromCVMat:grayMat];
UIImageView *imview = [[UIImageView alloc]initWithImage:cvimage];
imview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view addSubview:imview];
處理之前的圖像為:
處理之后的圖像為:
demo地址:https://github.com/GoldenRocking/OpenCV_iOS