圖形圖像處理 - Android 濾鏡效果

年初來深圳正式開始從事音視頻開發(fā)味抖,為啥我想從事音視頻開發(fā)呢?有一個簡單的理由是我想建立起自己的技術壁壘灰粮,別人不能做的你能做仔涩,別人解決不了的你能解決。我們工作多年甚至于做了幾十個項目粘舟,如果我們不能從項目中去學習新的東西熔脂,那技術就只能停滯不前了佩研。當然有哥們建議我說,你學的東西太多了但是不精霞揉,因此同樣我也建議大家還是先把 Java 基礎和 Android 基礎打牢旬薯。后面我將寫下一些圖形圖像處理的文章,很多是我自己學來的适秩,也有些是我工作中遇到的绊序。感興趣的哥們可以看下,也希望可以幫大家少走一些彎路秽荞。文章和視頻主要還是以 NDK 為主骤公,因此希望各位看官能有一些 c 和 c++ 的基礎,有一些數(shù)據(jù)結(jié)構和算法的基礎扬跋,如果沒有建議大家去看看我之前寫的一些文章阶捆。

1. OpenCV 安裝

OpenCV 是一個計算視覺的開源庫,主要算法涉及圖像處理和機器學習钦听。是 Intel 公司貢獻出來的洒试,因為它可以免費應用在商業(yè)和研究領域,且國內(nèi)大多數(shù)圖像處理相關的應用程序中都采用的是 OpenCV朴上,因此后面很大一部分內(nèi)容我們都基于 OpenCV 來講垒棋。官方給我們封裝了很多 java 層的接口,但總的來說可擴展性不是很高痪宰,因此后面我們主要采用 c++ 來寫捕犬,然后自己編譯成 so 庫來供 Android 調(diào)用。為了便于方法和算法的講解酵镜,我們暫時基于 VS 環(huán)境來編寫代碼,大家如果用的是 mac 電腦柴钻,可以去看看我之前的《NDK開發(fā)前奏 - 實現(xiàn)支付寶人臉識別功能》 淮韭,也可以直接基于 android 環(huán)境開發(fā)。接下來我們一步步來搭建 VS 的開發(fā)環(huán)境:

首先我們找到 opencv 的官網(wǎng) https://opencv.org/opencv-4-0-0-rc.html 贴届,目前最高版本是 4.0 點擊 Win pack 進行下載靠粪。下載下來是一個 exe 文件,我們不要安裝直接解壓就好毫蚓。找到 build\x64\vc14\bin 下占键,把目錄進行拷貝配置環(huán)境變量:

環(huán)境變量配置

然后新建 VS 空項目,找到菜單欄的 調(diào)試窗口 -> 屬性 -> 配置屬性 -> VC++ 目錄


在包含目錄和庫目錄中新增我們 opencv 的解壓目錄元潘。然后我們寫一個簡單實例測試能即可:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

void main(){
    // 本地讀取一張圖片
    Mat src = imread("C:/Users/hcDarren/Desktop/android/NDK/NDK_Day56/test1.jpg");
    Mat gray;
    // 轉(zhuǎn)灰度
    cvtColor(src, gray, COLOR_BGR2GRAY);
    // 將灰度圖顯示到窗口
    namedWindow("test pic",CV_WINDOW_NORMAL);
    imshow("test pic", gray);
    waitKey(0);
}

大家按照我這個配置去做畔乙,可能還是會遇到很多問題。但所有的問題都離不開兩個方面翩概,一個是頭文件牲距,一個是實現(xiàn)的 dll 動態(tài)庫返咱。

2. Android 濾鏡效果

我們來看一個比較常見同時也是非常簡單的例子,打開 QQ 空間發(fā)說說圖片時會有一個濾鏡功能牍鞠,我們可以自己先去看看那些濾鏡效果咖摹。

實現(xiàn)這樣的效果有多種方案,Java 層用 ColorMatrix 矩陣來實現(xiàn)难述,Java 層操作 Bitmap 像素萤晴,Native 層操作 Bitmap 像素指針等等。這里我把三種方案都寫上胁后,希望大家能夠做到舉一反三店读。以彩色圖轉(zhuǎn)灰度圖為例:

2.1 Java 層用 ColorMatrix 矩陣來實現(xiàn)

    public static Bitmap gary(Bitmap bitmap) {
        Bitmap gary = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
        Canvas canvas = new Canvas(gary);
        Paint paint = new Paint();
        // 比較流行的方法。幾個加權系數(shù)0.3,0.59,0.11是根據(jù)人的亮度感知系統(tǒng)調(diào)節(jié)出來的參數(shù)择同,是個廣泛使用的標準化參數(shù)
        ColorMatrix colorMatrix = new ColorMatrix(new float[]{
                0.30f, 0.59f, 0.11f, 0, 0,
                0.30f, 0.59f, 0.11f, 0, 0,
                0.30f, 0.59f, 0.11f, 0, 0,
                0, 0, 0, 1f, 0
        });
        ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
        paint.setColorFilter(colorFilter);
        canvas.drawBitmap(bitmap, 0, 0, paint);
        return gary;
    }

2.2 Java 層操作 Bitmap 像素

    public static Bitmap gary(Bitmap bitmap) {

        int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
        bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());

        for (int i = 0; i < pixels.length; i++) {
            int pixel = pixels[i];
            int a = (pixel >> 24) & 0xff;
            int r = (pixel >> 16) & 0xff;
            int g = (pixel >> 8) & 0xff;
            int b = pixel & 0xff;

            int gery = (int) (0.30f * r + 0.59f * g + 0.11f * b);
            pixels[i] = (a << 24) |  (gery << 16) |  (gery << 8)  |  gery;
        }

        Bitmap gary = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
        gary.setPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());

        return gary;
    }

2.3 Native 層操作 Bitmap 像素指針

extern "C"
JNIEXPORT void JNICALL
Java_com_ndk_day51_BitmapUtil_gary(JNIEnv *env, jclass type, jobject bitmap) {
    // 獲取 Bitmap 信息
    AndroidBitmapInfo bitmapInfo;
    AndroidBitmap_getInfo(env, bitmap, &bitmapInfo);

    // 鎖定畫布
    void *pixels;
    AndroidBitmap_lockPixels(env, bitmap, &pixels);

    for (int i = 0; i < bitmapInfo.width * bitmapInfo.height; ++i) {
        uint32_t *p_pixel = reinterpret_cast<uint32_t *>(pixels) + i;
        uint32_t pixel = *p_pixel;
        int a = (pixel >> 24) & 0xff;
        int r = (pixel >> 16) & 0xff;
        int g = (pixel >> 8) & 0xff;
        int b = pixel & 0xff;
        int gery = r * 0.3f + g * 0.59f + b * 0.11f;
        *p_pixel = (a << 24) | (gery << 16) | (gery << 8) | gery;
    }
    
    // 解鎖畫布
    AndroidBitmap_unlockPixels(env, bitmap);
}

如果我們不是很了解矩陣的操作两入,可以去 Google 查查資料。上面的代碼也還會有些許問題敲才,如果我們想用到項目中還得好好思考思考裹纳。

視頻地址:https://pan.baidu.com/s/1FqGwalxQimTwfoMKvIZNXw
視頻密碼:5xnx

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市紧武,隨后出現(xiàn)的幾起案子剃氧,更是在濱河造成了極大的恐慌,老刑警劉巖阻星,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋鞍,死亡現(xiàn)場離奇詭異,居然都是意外死亡妥箕,警方通過查閱死者的電腦和手機滥酥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畦幢,“玉大人坎吻,你說我怎么就攤上這事∮畲校” “怎么了瘦真?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黍瞧。 經(jīng)常有香客問我诸尽,道長,這世上最難降的妖魔是什么印颤? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任您机,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘往产。我一直安慰自己被碗,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布仿村。 她就那樣靜靜地躺著锐朴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔼囊。 梳的紋絲不亂的頭發(fā)上焚志,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音畏鼓,去河邊找鬼酱酬。 笑死,一個胖子當著我的面吹牛云矫,可吹牛的內(nèi)容都是我干的膳沽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼让禀,長吁一口氣:“原來是場噩夢啊……” “哼挑社!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巡揍,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤痛阻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腮敌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阱当,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年糜工,在試婚紗的時候發(fā)現(xiàn)自己被綠了弊添。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡捌木,死狀恐怖表箭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钮莲,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布彼水,位于F島的核電站崔拥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凤覆。R本人自食惡果不足惜链瓦,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慈俯,春花似錦渤刃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刑峡,卻和暖如春洋闽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背突梦。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工诫舅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宫患。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓刊懈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娃闲。 傳聞我的和親對象是個殘疾皇子虚汛,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

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

  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料畜吊? 從這篇文章中你...
    hw1212閱讀 12,699評論 2 59
  • 在Android開發(fā)中泽疆,一般對圖像的處理就是Bitmap(位圖),它包含了圖像的全部數(shù)據(jù)玲献,即點陣和顏色值殉疼,點陣就是...
    李晨瑋閱讀 7,883評論 1 33
  • 今天老師帶我們?nèi)チ颂蔷茣俏覀兒孟癖划敵闪嗣赓M的勞動力捌年,幫著老師讓參展商填問卷瓢娜,問卷一個小組就300份,期間還...
    skymemory7閱讀 371評論 0 0
  • 1 小時候,父親煮過一道菜:蒜子蒸鉗魚托酸。那個蒜頭褒颈,一瓣一瓣的,蒸熟了出來励堡,沒有了蒜的難聞的氣味谷丸,吃起來松松軟軟,還...
    小螢子閱讀 647評論 2 0
  • 5:15分泉唁,鬧鐘準時想起,起床嘍揩慕!穿上跑鞋亭畜,就感覺自己元氣滿滿! 這一段時間迎卤,淅淅瀝瀝的秋雨纏纏綿綿拴鸵。歇了幾天的身...
    谷子_8e39閱讀 470評論 11 11