iOS開發- 以圖搜圖功能實現 (源碼+解析)

來源:互聯網
上載者:User

iOS開發- 以圖搜圖功能實現 (源碼+解析)

以圖搜圖這個功能相當實用, 之前在實現這個功能的時候, 有一些筆記, 今天就整合成博文, 分享給大家。

 

這個demo主要實現的功能包括:

 

自訂拍照介面Image Recognition以圖搜圖資訊擷取(通過識別出的映像, 擷取對應資訊)

 

 

下面是一個簡單的示範, 如下:

 

那麼如何?這樣的功能呢?

如果自己去完成Image Recognition, 顯然不現實。

最早我研究的是GoogleAPI, 不過Google在天朝, 大家都懂得...

 

然後是百度了,嘗試了下, 效果還不錯。 另外, 百度也有自己“以圖搜圖”對應的App。不過我們只是為了學會如何?怎樣的功能, 管他呢。

 

所以,在以圖搜圖功能上, 我選擇了使用百度API,不過百度這個API只提供給他們的“百度輕拍”APP, 不對外開放,我也是通過輕拍抓到的API,然後進行分析。

 

好了, 接下去就是分析過程了。 demo之後會提供。

 

1. UIImage 轉 NSString

之後我們會採用 post方式, 擷取對應的json資料,但是這個請求裡面,要傳入 base64Encoding 編碼的 NSString (這裡放的是圖片資訊)

(不要問我為什麼, 百度就是這樣設計的 )

 

    UIImage* pic =[UIImage imageNamed:@test_1.png];    NSData* pictureData =UIImagePNGRepresentation(pic);    NSString* pictureDataString =[pictureData base64Encoding];

2. POST請求

 

這裡, 我抓到的URL是這樣的: http://qingpai.baidu.com/api/irs/rex?reqid=196423494211296782&ak=eyJjdCI6IjIwIn0%3D&encoding=base64

如果感興趣如何擷取的, 可以留言, 如果真有疑惑, 我之後會專門再寫一篇文章。 這裡不是本次的主題, 就不涉及這部分內容了

簡單分析下這個API。

qingpai.baidu.com/api/ 很明顯 , 它是為 ”百度輕拍“提供的

reqid, ak 這個是綁定裝置的。 這裡固定使用這個就可以

encoding=base64 表示傳入資料的編碼方式。

 

上面那個API是固定的, 需要改變的是我們post時候傳入的資料

具體如下:

 

    UIImage* pic =[UIImage imageNamed:@test_1.png];    NSData* pictureData =UIImagePNGRepresentation(pic);    NSString* pictureDataString =[pictureData base64Encoding];    //Post請求    NSString *post = [NSString stringWithFormat:@%@, pictureDataString];        NSData *bodyData = [[post stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]dataUsingEncoding:NSUTF8StringEncoding];//把bodyString轉換為NSData資料    NSURL *serverUrl = [NSURL URLWithString:@http://qingpai.baidu.com/api/irs/rex?reqid=196423494211296782&ak=eyJjdCI6IjIwIn0%3D&encoding=base64];//擷取到伺服器的url地址    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:serverUrl                                                           cachePolicy:NSURLRequestReloadIgnoringCacheData                                                       timeoutInterval:10];//請求這個地址, timeoutInterval:10 設定為10s逾時:請求時間超過10s會被認為串連不上,連線逾時        [request setHTTPMethod:@POST];//POST請求    [request setHTTPBody:bodyData];//body 資料    [request setValue:@application/x-www-form-urlencoded forHTTPHeaderField:@content-type];//要求標頭    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];    NSString *result = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];        NSMutableDictionary *addressDic = [result objectFromJSONString];        //非同步發送request,成功後會得到伺服器返回的資料    //返回的資料 根據系統的不同會返回不同編碼的資料,比如windows 為GBK,Ubuntu 為UTF8.。。    //注意轉換編碼格式    NSLog(@%@, addressDic);

看一下列印的資訊, 是json資料, 我拆分完以後, 大體長這樣:

 

 

返回的資料很多, 大家感興趣可以自己逐一分析。

簡單的介紹下.

facesatar 表示 識別出來相似的明星人臉。

 

name: 鄔靖靖,nameid: 1931,simi: 0.904725,pid: 1932/64.jpg,width: 440,height: 440,face_left: 143,face_top: 107,face_width: 193,face_height: 193

這裡是一項的資料. 我們需要的主要是 “name” 和 “simi”屬性,分別標示 明星姓名, 相似性。

 

其他的熟悉包括圖片的大小, 人臉的位置, 如果需要也可以使用。

另外, name 這裡的編碼是Unicode,所以如果一起輸出可能不明白什麼意思。(縮小到name, 單個輸出, 在終端可以看到中文)不過我們擷取到這個“name”值後,是可以直接顯示,會顯示中文的。

 

另外. 提供一個好用的網站,便於測試

中文轉Unicode
Unicode轉中文
http://javawind.net/tools/native2ascii.jsp?action=transform

 

再有,similar列表這裡列舉出了相似的圖片及其來源。 具體大家可以自己分析。

 

三。擷取詳細資料

我們可以通過json資料裡面, 擷取到相似性最高的那個人物姓名(也可以是景點名字, 這個API比較強大)

然後調用如下API,就可以顯示顯示詳細資料了。百度都為“輕拍”封裝好了。

比如, 人物姓名是 “鄔靖靖” , 調用如下URL:

http://qingpai.baidu.com/api/proxy/search?word=鄔靖靖&pn=1

我這裡直接用Safari開啟, 就可以看到如下效果:

 

這樣一個封裝好的WAP介面, 我們可以直接在UIWebView中, 利用URL開啟, 效果就很好了。

 

 

將到這裡, 主要就是分享一些可供我們直接使用的API。 當然, 這個API在別處肯定是找不到的。

 

另外, 圖片搜尋我們還可以拓展出好多知識,

比如 Face Service,光學字元辨識, 映像文字識別....

以上提到的那3部分, 之前都有寫過相關demo。 不過最近忙著考試, 等以後有時間了再逐一分享。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.