iOS OpenCV 圖像灰度處理

2017-06-21 小溪彼岸 Cocoa開發者社區

推薦人:wo709128079


有時候開發過程中,切圖滿足不了我們的需求,此時我們需要對圖像進行灰度處理,例如QQ頭像在線、離線等不同狀態等。


可以嘗試的解決方案:


  • 第一種:讓UI重新切圖 

  • 第二種:切圖不頂用,用代碼實現(重新生成帶灰度的圖片)


首先介紹一下OpenCVopencv的全稱是:Open Source Computer Vision Library。OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。哈哈,,是不是很囉嗦,簡單點就是一個處理圖像的視覺庫。


常見錯誤: 


如果編譯時遇見這樣的錯誤,可以嘗試的解決方法如下:

 


將報錯的地方的 NO 改爲 NO_EXPOSURE_COMPENSATOR


實現步驟:


第一種方式:OpenCV3實現


  • 第一步:導入openCV開發包

  • 第二步:功能實現 


利用OpenCV比較簡單,實現代碼如下:


- (UIImage*)imageToGrayImage:(UIImage*)image{


    //image源文件

    // 1.將iOS的UIImage轉成c++圖片(數據:矩陣)

    Mat mat_image_gray;

    UIImageToMat(image, mat_image_gray);


    // 2. 將c++彩色圖片轉成灰度圖片

    // 參數一:數據源

    // 參數二:目標數據

    // 參數三:轉換類型

    Mat mat_image_dst;

    cvtColor(mat_image_gray, mat_image_dst, COLOR_BGRA2GRAY);


    // 3.灰度 -> 可顯示的圖片

    cvtColor(mat_image_dst, mat_image_gray, COLOR_GRAY2BGR);


    // 4. 將c++處理之後的圖片轉成iOS能識別的UIImage

    return MatToUIImage(mat_image_gray);

}


第二種方式:採用iOS系統默認的開發庫實現 


這種方式可以說真是夠繁瑣,夠噁心,哈哈哈


#pragma mark - 採用系統自帶的庫進行實現

- (UIImage*)systemImageToGrayImage:(UIImage*)image{

    int width  = image.size.width;

    int height = image.size.height;

    //第一步:創建顏色空間(說白了就是開闢一塊顏色內存空間)

    CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceGray();


    //第二步:顏色空間上下文(保存圖像數據信息)

    //參數一:指向這塊內存區域的地址(內存地址)

    //參數二:要開闢的內存的大小,圖片寬

    //參數三:圖片高

    //參數四:像素位數(顏色空間,例如:32位像素格式和RGB的顏色空間,8位)

    //參數五:圖片的每一行佔用的內存的比特數

    //參數六:顏色空間

    //參數七:圖片是否包含A通道(ARGB四個通道)

    CGContextRef context = CGBitmapContextCreate(nil, width, height, 8, 0, colorRef, kCGImageAlphaNone);

    //釋放內存

    CGColorSpaceRelease(colorRef);


    if (context == nil) {

        return  nil;

    }


    //渲染圖片

    //參數一:上下文對象

    //參數二:渲染區域

    //源圖片

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);;


    //將繪製的顏色空間轉成CGImage

    CGImageRef grayImageRef = CGBitmapContextCreateImage(context);


    //將c/c++圖片轉成iOS可顯示的圖片

    UIImage *dstImage = [UIImage imageWithCGImage:grayImageRef];


    //釋放內存

    CGContextRelease(context);

    CGImageRelease(grayImageRef);


    return dstImage;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章