OpenCV學(xué)習(xí)_ios平臺(tái)(一):在ios平臺(tái)調(diào)用

demo地址:https://github.com/GoldenRocking/OpenCV_iOS
OpenCV是一個(gè)開(kāi)源的計(jì)算機(jī)視覺(jué)庫(kù)。OpenCV采用C/C++語(yǔ)言編寫(xiě)。關(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ù)類(lèi)型:

+(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++所寫(xiě),所以我們?cè)谝玫牡胤叫枰獙?m文件修改為.mm。為了方便使用庫(kù)函數(shù),我們可以在調(diào)用的類(lèi)中添加如下代碼:

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];

處理之前的圖像為:

timg.png

處理之后的圖像為:

gray.png

demo地址:https://github.com/GoldenRocking/OpenCV_iOS

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,093評(píng)論 7 249
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,304評(píng)論 4 61
  • 在最近的面試中, 被問(wèn)到了加密算法,雖然回答了面試官的問(wèn)題,自己總覺(jué)對(duì)于概念理解不是特別到位。本篇主要是對(duì)加密算法...
    jacydai閱讀 1,232評(píng)論 0 2
  • 初識(shí)瑜伽大概是2010年,畢業(yè)工作小三年,加班很兇猛,導(dǎo)致身體說(shuō)不出哪兒不爽,但確實(shí)不爽,估摸進(jìn)入亞健康狀態(tài),同事...
    易小青的花花世界閱讀 366評(píng)論 1 1
  • 似乎從來(lái)到這個(gè)學(xué)校,我一直在失望。 失望學(xué)校的排名,失望學(xué)校的條件,失望老師的能力……最失望的莫過(guò)于自己。就好像你...
    微涼緩緩閱讀 1,064評(píng)論 0 2

友情鏈接更多精彩內(nèi)容