使用透視變換矯正扭曲的圖(opencv)和矩形邊緣檢測(原生CoreImage框架下CIDetector)都是基于iOS版本
之前也找了很多都是vs啊将硝,android啊榜掌,運(yùn)用xcode的.mm混合編譯時出現(xiàn)一大堆崩潰問題娜氏,無奈跨平臺移植demo無果,只好搞原生iOS工程下的
運(yùn)用場景:手機(jī)拍照目標(biāo)文件往往有一個角度,或者目標(biāo)文件之外的物體衣吠,需要經(jīng)過處理后只要目標(biāo)文件,且正視無角度傾斜
主要意思就是手機(jī)拍照
攝像頭觀察一個矩形的圖片時往往只能得到一個扭曲的圖片:
原圖:(處理后的)
實際情況是攝像頭經(jīng)常從某個角度觀察圖片:(原始的未處理的)
方法一.使用opencv的透視變換把圖片矯正為正視的角度
大概過程:
1壤靶、通過灰度缚俏、模糊和二值化得到:
2、然后對查找圖片外包矩形輪廓贮乳,并查找角點得到:
3.通過梯形四個角點和外包矩形的四個頂點得到變換矩陣忧换,進(jìn)行投射變換,最后得到:
方法二.原生CoreImage框架下CIDetector進(jìn)行矩形邊緣檢測
這是iOS的一個原生api
coreImage framework 組成
apple 已經(jīng)幫我們把coreImage的處理分類好向拆,來看看它的結(jié)構(gòu):
主要分為三部分:
1)定義部分:CoreImage 何CoreImageDefines亚茬。見名思義,代表了CoreImage 這個框架和它的定義浓恳。
2)操作部分:
濾鏡(CIFliter):CIFilter 產(chǎn)生一個CIImage才写。典型的,接受一到多的圖片作為輸入奖蔓,經(jīng)過一些過濾操作赞草,產(chǎn)生指定輸出的圖片。
檢測(CIDetector):CIDetector 檢測處理圖片的特性吆鹤,如使用來檢測圖片中人臉的眼睛厨疙、嘴巴、等等疑务。(這里我們將用到這個CIDetector進(jìn)行矩形邊框的檢測沾凄,不僅僅局限于人臉的檢測)
特征(CIFeature):CIFeature 代表由?detector處理后產(chǎn)生的特征梗醇。
3)圖像部分:
畫布(CIContext):畫布類可被用與處理Quartz 2D 或者OpenGL∪鲶埃可以用它來關(guān)聯(lián)CoreImage類叙谨。如濾鏡、顏色等渲染處理保屯。
顏色(CIColor): ? 圖片的關(guān)聯(lián)與畫布手负、圖片像素顏色的處理。
向量(CIVector): 圖片的坐標(biāo)向量等幾何方法處理姑尺。
圖片(CIImage): 代表一個圖像竟终,可代表關(guān)聯(lián)后輸出的圖像。
iOS的人臉識別從iOS 5(2011)就有了切蟋,不過一直沒怎么被關(guān)注過统捶。人臉識別API允許開發(fā)者不僅可以檢測人臉,也可以檢測到面部的一些特殊屬性柄粹,比如說微笑或眨眼喘鸟。
人臉識別過程一般分為以下3個步驟:
1.首先建立人臉的面紋數(shù)據(jù)庫.可以通過照相機(jī)或攝像機(jī)采集人臉的面相圖片,將這些面相圖片生成面紋編碼保存到數(shù)據(jù)庫中.
2.獲取當(dāng)前人臉面相圖片.即通過照相機(jī)或攝像機(jī)采集人臉的面相圖片,將當(dāng)前的面相文件生成面紋編碼
3.用當(dāng)前的面紋編碼與數(shù)據(jù)庫中的面紋編碼進(jìn)行對比
在iOS5之后提供人臉識別的API,通過提供的CIDetector類可以進(jìn)行人臉特征識別,CIDetector是CoreImage框架中的一個特征識別濾鏡,CIDetector主要用于人臉特征識別.通過它還可以獲得眼睛和嘴的特征信息.但是CIDetector并不包括面紋編碼提取,面紋編碼處理還需要更為復(fù)雜的算法處理.也就是說使用CIDetector類可以找到一張圖片中的人臉,但這張臉是誰,CIDetector無法判斷,這需要有一個面紋數(shù)據(jù)庫,把當(dāng)前人臉提取面紋編碼然后與數(shù)據(jù)庫進(jìn)行對比.(openCV FACE.COM)
CIContext *context = [CIContext contextWithOptions:nil];
UIImage *imageInput = [_inputImageView image];
CIImage *image = [CIImage imageWithCGImage:imageInput.CGImage];
//設(shè)置識別參數(shù)
NSDictionary *param = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh
forKey:CIDetectorAccuracy];
//聲明一個CIDetector,并設(shè)定識別類型
CIDetector* faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace
context:context options:param];
//取得識別結(jié)果
NSArray *detectResult = [faceDetector featuresInImage:image];
UIView *resultView = [[UIView alloc] initWithFrame:_inputImageView.frame];
[self.view addSubview:resultView];
for(CIFaceFeature* faceFeature in detectResult) {
//臉部
UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];
faceView.layer.borderWidth =1;
faceView.layer.borderColor = [UIColor orangeColor].CGColor;
[resultView addSubview:faceView];
[faceView release];
//左眼
if(faceFeature.hasLeftEyePosition) {
}
//右眼
if(faceFeature.hasRightEyePosition) {
}
//嘴巴
if(faceFeature.hasMouthPosition) {
}
}
[resultView setTransform:CGAffineTransformMakeScale(1, -1)];
[resultView release];
也就是說驻右,你去銀行辦理銀行卡出銀行卡的機(jī)器(現(xiàn)在都是類似于ATM一樣的機(jī)器出卡迷守,不用在人工窗口進(jìn)行辦卡出卡了)對你進(jìn)行拍照,最后形成面紋數(shù)據(jù)庫從而永久保存旺入,一直到你over掉這個數(shù)據(jù)庫依然永久存在,這一點是多么的可怕凯力,辦卡且行且珍惜吧茵瘾。。咐鹤。拗秘。
這里只是進(jìn)行矩形邊框的識別,至于人臉的識別參見:
至于用那個方法讀者自己甄別
參考demo參見:
鏈接: https://pan.baidu.com/s/1eSAixhg 密碼: jd7i
若是此demo幫助到了你歡迎大賞和start
更多資源學(xué)習(xí)交流群:群號:224110749