OpenCV (一):初相識(shí):馬賽克處理圖片

大概介紹

OpenCV官網(wǎng)

  • OpenCV (Open Source Computer Vision Library) 是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上豫领。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成虫溜,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法靶壮。

  • OpenCV用C++和C語言編寫庄萎,它的主要接口也是C++語言,但是依然保留了大量的C語言接口豁遭。該庫(kù)也有大量的Python廊佩、Java and MATLAB的接口囚聚。如今也提供對(duì)于C#、Ch罐寨、Ruby,GO的支持靡挥。所以該庫(kù)支持多種語言開發(fā):如C,C++,Object_C,Swift, Windows, Android,Mac OS,Python,Java和 MATLAB等.所以通常用它來做算法的移植序矩,并且OpenCV的代碼經(jīng)過適當(dāng)改寫可以正常的運(yùn)行在DSP系統(tǒng)和ARM嵌入式系統(tǒng)中

Demo測(cè)試

  • 本文主要基于iOS來闡述,測(cè)試使用這個(gè)框架去給一張圖片添加馬賽克,簡(jiǎn)單了解一下大概使用

1.首先得去官網(wǎng)下載它,然后倒入到項(xiàng)目中


opencv2.framework.png

2.先了解一下OpenCV的基本概念:
相信大家都知道:在C++和OC混編中報(bào)錯(cuò),需要將 .m 文件 修改為 .mm 文件;
還有就是C++支持命名空間,所以需要導(dǎo)入C++的命名空間

using namespace cv;

Mat 矩陣 是OPenCV的基本數(shù)據(jù)結(jié)構(gòu)

馬賽克原理 大概其意思就是處理像素點(diǎn),可以理解為把原先的一個(gè)一個(gè)像素點(diǎn)按照3 x 3 或者4 x 4劃分成一個(gè)小方塊,這個(gè)小方塊的像素展示這個(gè)小方塊最左上角的那個(gè)像素點(diǎn)的顏色來展示,這樣平鋪開來,比如原先展示10 x 10個(gè)像素點(diǎn)按照5x 5為一個(gè)方塊展示,就只展示了4個(gè)像素點(diǎn)

(10 x 10) ÷ (5 x 5) = 4,

這樣看起來肯定模糊,就是馬賽克效果


馬賽克原理.png

說那么費(fèi)勁,看代碼怎么實(shí)現(xiàn)吧

//自定義UIImageUtils,在UIImageUtils中導(dǎo)入OpenCV的頭文件
//倒入OpenCV框架
//核心頭文件
#import <opencv2/opencv.hpp>
//對(duì)iOS支持
#import <opencv2/imgcodecs/ios.h>
  //導(dǎo)入矩陣幫助類
#import <opencv2/highgui.hpp>
#import <opencv2/core/types.hpp>
/*
  * 自定義 UIImageUtils.m,  因?yàn)楹蚈C混編,所以修改成 UIImageUtils.mm


    參數(shù)image   是外界傳遞進(jìn)來的源圖片,就是需要對(duì)它進(jìn)行馬賽克處理
    參數(shù)level     是處理的級(jí)別,這個(gè)值越小,馬賽克就越密,顆粒感越弱.,就是上面馬賽克原理說明所說的 5*5 中的 5, level = 5,  或者說上圖畫 level = 3
*/
 +(UIImage*)opencvImage:(UIImage*)image level:(int)level{
        //實(shí)現(xiàn)功能
        //第一步:將iOS圖片->OpenCV圖片(Mat矩陣)
        Mat mat_image_src;  //源圖片
        UIImageToMat(image, mat_image_src);
        
        //第二步:確定寬高
        int width = mat_image_src.cols;
        int height = mat_image_src.rows;
        
        
        
        //圖片類型->進(jìn)行轉(zhuǎn)換
        //在OpenCV里面,有個(gè)隱藏的坑,那就是 OpenCV只能支持 處理 RGB,而圖片是 ARGB的,則如果不進(jìn)行圖片類型轉(zhuǎn)換是沒有效果的
        //圖片ARGB的, 將ARGB->RGB
       // cvtColor的三個(gè)參數(shù): 第一個(gè)是源圖片,第二個(gè)參數(shù)是目標(biāo)圖片,第三參數(shù)是 轉(zhuǎn)換格式  2諧音to,意思是將RGBA轉(zhuǎn)換成RGB的,第四個(gè)參數(shù)是通道個(gè)數(shù),RBG 就是3個(gè)通道
        Mat mat_image_dst;
        cvtColor(mat_image_src, mat_image_dst, CV_RGBA2RGB, 3);
        
        //研究OpenCV時(shí)候鸯绿,如何發(fā)現(xiàn)巨坑?
        //觀察規(guī)律
        //看到了OpenCV官方網(wǎng)站->每次進(jìn)行圖像處理時(shí)候簸淀,規(guī)律->每一次都會(huì)調(diào)用cvtColor保持一致(RGB)
        //所以:每一次你在進(jìn)行轉(zhuǎn)換的時(shí)候瓶蝴,一定要記得轉(zhuǎn)換類型
        
        //為了不影響原始圖片,將處理成RBG 3通道的Mat 進(jìn)行復(fù)制一份
        Mat mat_image_clone = mat_image_dst.clone();
        
        //第三步:馬賽克處理
        //分析馬賽克算法原理
        //level = 3   ->   3 * 3矩形
        //動(dòng)態(tài)的處理
        int x = width - level;
        int y = height - level;
        
      //雙重for循環(huán),一個(gè)小方塊一個(gè)小方塊處理
        for (int i = 0; i < y; i += level) {
            for (int j = 0; j < x; j += level) {
                //創(chuàng)建一個(gè)矩形區(qū)域 (就是那個(gè)馬賽克小方塊)
                Rect2i mosaicRect = Rect2i(j, i, level, level);
                
                //給填Rect2i區(qū)域->填充數(shù)據(jù)->原始數(shù)據(jù)
                Mat roi = mat_image_dst(mosaicRect);
                
                //讓整個(gè)矩形區(qū)域顏色值保持一致
                //mat_image_clone.at<Vec3b>(i, j)->像素點(diǎn)(顏色值組成->多個(gè))->ARGB->數(shù)組
                //mat_image_clone.at<Vec3b>(i, j)[0]->R值
                //mat_image_clone.at<Vec3b>(i, j)[1]->G值
                //mat_image_clone.at<Vec3b>(i, j)[2]->B值
                Scalar scalar = Scalar(
                       mat_image_clone.at<Vec3b>(i, j)[0],
                       mat_image_clone.at<Vec3b>(i, j)[1],
                       mat_image_clone.at<Vec3b>(i, j)[2]);
                
                //將處理好矩形區(qū)域->數(shù)據(jù)->拷貝到圖片上面去->修改后的數(shù)據(jù)
                //CV_8UC3解釋:
                //CV_:表示框架命名空間
                //8表示:32位色->ARGB->    8位 = 1字節(jié) ->所以: 4個(gè)字節(jié)
                //U分析
                //兩種類型:有符號(hào)類型(Sign->有正負(fù)->簡(jiǎn)寫"S")、無符號(hào)類型(Unsign->正數(shù)->"U")
                //無符號(hào)類型:0-255(通常情況)
                //有符號(hào)類型:-128-127
                //C分析:char類型
                //3表示:3個(gè)通道->RGB
                Mat roiCopy = Mat(mosaicRect.size(), CV_8UC3, scalar);
                roiCopy.copyTo(roi);
            }
        }
        
        //第四步:將OpenCV圖片->iOS圖片
        return MatToUIImage(mat_image_dst);
    }
    

最后看看level不同的效果吧:
等級(jí)為80,顆粒感強(qiáng).png

等級(jí)為15,顆粒感弱.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末租幕,一起剝皮案震驚了整個(gè)濱河市舷手,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劲绪,老刑警劉巖男窟,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異贾富,居然都是意外死亡歉眷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門颤枪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汗捡,“玉大人,你說我怎么就攤上這事畏纲∩茸。” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵盗胀,是天一觀的道長(zhǎng)艘蹋。 經(jīng)常有香客問我,道長(zhǎng)票灰,這世上最難降的妖魔是什么女阀? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任咱娶,我火速辦了婚禮,結(jié)果婚禮上强品,老公的妹妹穿的比我還像新娘膘侮。我一直安慰自己,他們只是感情好的榛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布琼了。 她就那樣靜靜地躺著,像睡著了一般夫晌。 火紅的嫁衣襯著肌膚如雪雕薪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天晓淀,我揣著相機(jī)與錄音所袁,去河邊找鬼。 笑死凶掰,一個(gè)胖子當(dāng)著我的面吹牛警没,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袄琳,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼婶恼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了畅涂?” 一聲冷哼從身側(cè)響起港华,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎午衰,沒想到半個(gè)月后立宜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臊岸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年橙数,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扇单。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡商模,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜘澜,到底是詐尸還是另有隱情施流,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布鄙信,位于F島的核電站瞪醋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏装诡。R本人自食惡果不足惜银受,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一践盼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宾巍,春花似錦咕幻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至选浑,卻和暖如春蓝厌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背古徒。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工拓提, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隧膘。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓代态,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親舀寓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胆数,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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