使用透視變換矯正扭曲的圖(opencv)矩形邊緣檢測(cè)(原生CoreImage框架下CIDetector)

使用透視變換矯正扭曲的圖(opencv)和矩形邊緣檢測(cè)(原生CoreImage框架下CIDetector)都是基于iOS版本

之前也找了很多都是vs啊,android啊,運(yùn)用xcode的.mm混合編譯時(shí)出現(xiàn)一大堆崩潰問題,無(wú)奈跨平臺(tái)移植demo無(wú)果,只好搞原生iOS工程下的

運(yùn)用場(chǎng)景:手機(jī)拍照目標(biāo)文件往往有一個(gè)角度,或者目標(biāo)文件之外的物體,需要經(jīng)過處理后只要目標(biāo)文件,且正視無(wú)角度傾斜

主要意思就是手機(jī)拍照

攝像頭觀察一個(gè)矩形的圖片時(shí)往往只能得到一個(gè)扭曲的圖片:

原圖:(處理后的)


實(shí)際情況是攝像頭經(jīng)常從某個(gè)角度觀察圖片:(原始的未處理的)


方法一.使用opencv的透視變換把圖片矯正為正視的角度

大概過程:

1、通過灰度、模糊和二值化得到:


2、然后對(duì)查找圖片外包矩形輪廓,并查找角點(diǎn)得到:


3.通過梯形四個(gè)角點(diǎn)和外包矩形的四個(gè)頂點(diǎn)得到變換矩陣,進(jìn)行投射變換,最后得到:


方法二.原生CoreImage框架下CIDetector進(jìn)行矩形邊緣檢測(cè)

這是iOS的一個(gè)原生api

coreImage framework 組成

apple 已經(jīng)幫我們把coreImage的處理分類好,來看看它的結(jié)構(gòu):

主要分為三部分:

1)定義部分:CoreImage 何CoreImageDefines。見名思義,代表了CoreImage 這個(gè)框架和它的定義。

2)操作部分:

濾鏡(CIFliter):CIFilter 產(chǎn)生一個(gè)CIImage。典型的,接受一到多的圖片作為輸入,經(jīng)過一些過濾操作,產(chǎn)生指定輸出的圖片。

檢測(cè)(CIDetector):CIDetector 檢測(cè)處理圖片的特性,如使用來檢測(cè)圖片中人臉的眼睛、嘴巴、等等。(這里我們將用到這個(gè)CIDetector進(jìn)行矩形邊框的檢測(cè),不僅僅局限于人臉的檢測(cè))

特征(CIFeature):CIFeature 代表由?detector處理后產(chǎn)生的特征。

3)圖像部分:

畫布(CIContext):畫布類可被用與處理Quartz 2D 或者OpenGL??梢杂盟鼇黻P(guān)聯(lián)CoreImage類。如濾鏡、顏色等渲染處理。

顏色(CIColor): ? 圖片的關(guān)聯(lián)與畫布、圖片像素顏色的處理。

向量(CIVector): 圖片的坐標(biāo)向量等幾何方法處理。

圖片(CIImage): 代表一個(gè)圖像,可代表關(guān)聯(lián)后輸出的圖像。

iOS的人臉識(shí)別從iOS 5(2011)就有了,不過一直沒怎么被關(guān)注過。人臉識(shí)別API允許開發(fā)者不僅可以檢測(cè)人臉,也可以檢測(cè)到面部的一些特殊屬性,比如說微笑或眨眼。

人臉識(shí)別過程一般分為以下3個(gè)步驟:

1.首先建立人臉的面紋數(shù)據(jù)庫(kù).可以通過照相機(jī)或攝像機(jī)采集人臉的面相圖片,將這些面相圖片生成面紋編碼保存到數(shù)據(jù)庫(kù)中.

2.獲取當(dāng)前人臉面相圖片.即通過照相機(jī)或攝像機(jī)采集人臉的面相圖片,將當(dāng)前的面相文件生成面紋編碼

3.用當(dāng)前的面紋編碼與數(shù)據(jù)庫(kù)中的面紋編碼進(jìn)行對(duì)比

在iOS5之后提供人臉識(shí)別的API,通過提供的CIDetector類可以進(jìn)行人臉特征識(shí)別,CIDetector是CoreImage框架中的一個(gè)特征識(shí)別濾鏡,CIDetector主要用于人臉特征識(shí)別.通過它還可以獲得眼睛和嘴的特征信息.但是CIDetector并不包括面紋編碼提取,面紋編碼處理還需要更為復(fù)雜的算法處理.也就是說使用CIDetector類可以找到一張圖片中的人臉,但這張臉是誰(shuí),CIDetector無(wú)法判斷,這需要有一個(gè)面紋數(shù)據(jù)庫(kù),把當(dāng)前人臉提取面紋編碼然后與數(shù)據(jù)庫(kù)進(jìn)行對(duì)比.(openCV FACE.COM)

CIContext *context = [CIContext contextWithOptions:nil];

UIImage *imageInput = [_inputImageView image];

CIImage *image = [CIImage imageWithCGImage:imageInput.CGImage];

//設(shè)置識(shí)別參數(shù)

NSDictionary *param = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh

forKey:CIDetectorAccuracy];

//聲明一個(gè)CIDetector,并設(shè)定識(shí)別類型

CIDetector* faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace

context:context options:param];

//取得識(shí)別結(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)行辦卡出卡了)對(duì)你進(jìn)行拍照,最后形成面紋數(shù)據(jù)庫(kù)從而永久保存,一直到你over掉這個(gè)數(shù)據(jù)庫(kù)依然永久存在,這一點(diǎn)是多么的可怕,辦卡且行且珍惜吧。。。。

這里只是進(jìn)行矩形邊框的識(shí)別,至于人臉的識(shí)別參見:

iOS之使用CoreImage進(jìn)行人臉識(shí)別

至于用那個(gè)方法讀者自己甄別

參考demo參見:

OpenCVAndCoreImage-CIDetector

鏈接: https://pan.baidu.com/s/1eSAixhg 密碼: jd7i

若是此demo幫助到了你歡迎大賞和start

更多資源學(xué)習(xí)交流群:群號(hào):224110749

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容