iOS OpenCV 相機灰度處理
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
//指定影象大小
self.videoCamera.defaultAVCaptureSessionPreset =AVCaptureSessionPreset1280x720;
//設定相機方向
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
// 設定defaultFPS設定為攝像機的FPS,如果處理少於預期的FPS,幀被自動丟棄。
self.videoCamera.defaultFPS =
// 屬性grayscale=YES使用不同的顏色空間,即 “YUV (YpCbCr 4:2:0)”,而grayscale=NO將輸出32位BGRA。
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的程式碼比較簡單就不傳了!後續封裝一個簡單的視訊處理工具類再上傳程式碼!