1. 程式人生 > >iOS OpenCV 相機灰度處理

iOS OpenCV 相機灰度處理

準備工作完畢開始正文,我們就按照官網文件來操作,在storyboard裡我們拖入UIImageView控制元件,設定約束,這個

UIImageView是用來呈現影象的,我們再拖入1個UIButton,用來切換原影象和灰度影象!將UIImageView拖成屬性,Button拖為方法!

接下來我們需要將CvVideoCamera類設為全域性屬性

//4,使用opencv需要匯入系統庫:

     opencv2

     Accelerate

     AssetsLibrary

     AVFoundation

     CoreGraphics

     CoreImage

     CoreMedia

     CoreVideo

     QuartzCore

     UIKit

     Foundatio

//相機(opencv視訊處理框架類,相機或視訊都可以進行處理)

@property(nonatomic,strong)CvVideoCamera * videoCamera;

我們在ViewDidLoad初始化影象處理的類

// 引數:initWithParentView:指定相機預覽畫面

self.videoCamera = [[CvVideoCameraalloc]initWithParentView:self.imageView];

//指定攝像機的攝像頭方向(後置和前置)

self.videoCamera.defaultAVCaptureDevicePosition

= AVCaptureDevicePositionBack;

//指定影象大小

self.videoCamera.defaultAVCaptureSessionPreset =AVCaptureSessionPreset1280x720;

//設定相機方向

self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;

//    設定defaultFPS設定為攝像機的FPS如果處理少於預期的FPS,幀被自動丟棄。

self.videoCamera.defaultFPS =

30;

//    屬性grayscale=YES使用不同的顏色空間,即 “YUV (YpCbCr 4:2:0)”,而grayscale=NO將輸出32BGRA

self.videoCamera.grayscaleMode =NO;

1。首先需要新增幀回撥監聽(新增delegate)需要遵循協議<CvVideoCameraDelegate>

2.當我們在預覽相機的時候,會實時回撥delegate,然後客戶端進行幀處理,

self.videoCamera.delegate=self;

官網文件是建立一個開啟相機的按鈕,點選按鈕開啟相機!起初我是在ViewDidLoad裡將CvVideoCamera初始化完畢後,就開啟相機,但是出現了一個問題,就是我無論怎麼設定相機方向,影象顯示的都是不對的!如圖:

只有這一點與文件不同,我猜測是view載入時機問題導致,所以我在ViewDidAppear裡開始了攝像頭,完美解決!

我們為了實現切換原圖與灰度的切換,設定一個全域性的BOOL 值,isGray;

- (IBAction)grayBtn:(id)sender {

   self.isGray = !isGary;

}


實現代理,

//當我們相機在預覽的時候,或者在視訊播放的時候實時回撥方法

-(void)processImage:(cv::Mat &)image{

if(!self.isGray){

/*是一個矩陣,是一種資料結構理解為圖片就可以了*/

cv::Mat image_copy;

/*

引數:原圖

 2 矩陣

 3 轉換型別COLOR_BGR2GRAY

 */

//RGB-GRay

cvtColor(image, image_copy, cv::COLOR_BGR2GRAY);

//圖片反轉(會將黑色的畫素點轉成黑色,黑色顯示成白色)

bitwise_not(image_copy, image_copy);

cv::Mat bgr;

//原圖為3原色(3個通道)轉成4個通道

//轉換過程 gray-> RGB -> ARGB

//原來RGB->ARGB

cvtColor(image_copy, bgr, cv::COLOR_GRAY2BGR);

//從新給我們的原始圖片設定資料

//將我們修改後的幀畫面,顯示在預覽圖片

//Gray->RGB

cvtColor(bgr, image, cv::COLOR_BGR2BGRA);

}

}


一切準備就緒,執行工程,出現了2個錯誤,可以定位到錯誤程式碼!解決方案:

 將報錯的程式碼enum { NO, GAIN, GAIN_BLOCKS };

改成: enum { CNO, GAIN, GAIN_BLOCKS };

因為系統存在NO,不允許

出現的2個錯誤都是因為這個問題

我們需要真機執行,真機執行證書,具體操作大家應該都懂,還有就是相機需要設定全選,否則會崩潰,這些設定都知道,不知道根據報錯去設定就可以了!

接下來我們看效果就可以了!

先看原圖:

灰度圖片:(代理裡面有個圖片反轉的,我先看沒有把圖片反轉的程式碼註釋的效果)正好我家“燈泡”可以完美闡釋

灰度圖片:註釋掉圖片反轉的程式碼

這兩張灰度圖片的區別顯而易見!不過多解釋(bitwise_not(image_copy, image_copy);這句程式碼的作用)!

簡單的視訊灰度處理就完成了!後續會持續更新!

如有錯誤,歡迎指正,共同學習

本人QQ:353634026

demo的程式碼比較簡單就不傳了!後續封裝一個簡單的視訊處理工具類再上傳程式碼!