iOS開發- 以圖搜圖功能實現 (demo+解析)
以圖搜圖這個功能相當實用, 之前在實現這個功能的時候, 有一些筆記, 今天就整合成博文, 分享給大家。
這個demo主要實現的功能包括:
自定義拍照介面影象識別以圖搜圖資訊獲取(通過識別出的影象, 獲取對應資訊)下面是一個簡單的演示, 如下:
那麼如何實現這樣的功能呢?
如果自己去完成影象識別, 顯然不現實。
最早我研究的是谷歌API, 不過谷歌在天朝, 大家都懂得...
然後是百度了,嘗試了下, 效果還不錯。 另外, 百度也有自己“以圖搜圖”對應的App。不過我們只是為了學會如何實現怎樣的功能, 管他呢。
所以,在以圖搜圖功能上, 我選擇了使用百度API,不過百度這個API只提供給他們的“百度輕拍”APP, 不對外開放,我也是通過輕拍抓到的API,然後進行分析。
好了, 接下去就是分析過程了。 demo之後會提供。
1. UIImage 轉 NSString
之後我們會採用 post方式, 獲取對應的json資料,但是這個請求裡面,要傳入 base64Encoding 編碼的 NSString (這裡放的是圖片資訊)
(不要問我為什麼, 百度就是這樣設計的 )
?1 2 3 |
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時候傳入的資料
具體如下:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 表示 識別出來相似的明星人臉。
?1 2 3 4 5 6 7 8 9 10 |
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”值後,是可以