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ǔ)言編寫希太。關(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];

處理之前的圖像為:

timg.png

處理之后的圖像為:

gray.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末几蜻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爽撒,更是在濱河造成了極大的恐慌入蛆,老刑警劉巖响蓉,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硕勿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡枫甲,警方通過(guò)查閱死者的電腦和手機(jī)源武,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)想幻,“玉大人粱栖,你說(shuō)我怎么就攤上這事≡嗵海” “怎么了闹究?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)食店。 經(jīng)常有香客問(wèn)我渣淤,道長(zhǎng),這世上最難降的妖魔是什么吉嫩? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任价认,我火速辦了婚禮,結(jié)果婚禮上自娩,老公的妹妹穿的比我還像新娘用踩。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布脐彩。 她就那樣靜靜地躺著碎乃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惠奸。 梳的紋絲不亂的頭發(fā)上荠锭,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音晨川,去河邊找鬼证九。 笑死,一個(gè)胖子當(dāng)著我的面吹牛共虑,可吹牛的內(nèi)容都是我干的愧怜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妈拌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拥坛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起尘分,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤猜惋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后培愁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體著摔,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年定续,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谍咆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡私股,死狀恐怖摹察,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倡鲸,我是刑警寧澤供嚎,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站峭状,受9級(jí)特大地震影響克滴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宁炫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一偿曙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧羔巢,春花似錦望忆、人聲如沸罩阵。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稿壁。三九已至,卻和暖如春歉备,著一層夾襖步出監(jiān)牢的瞬間傅是,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蕾羊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喧笔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓龟再,卻偏偏與公主長(zhǎng)得像书闸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子利凑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

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