以圖搜圖這個功能相當實用, 之前在實現這個功能的時候, 有一些筆記, 今天就整合成博文, 分享給大家。
這個demo主要實現的功能包括:
自定義拍照界面圖像識別以圖搜圖信息獲取(通過識別出的圖像, 獲取對應信息)
下面是一個簡單的演示, 如下:
那麼如何實現這樣的功能呢?
如果自己去完成圖像識別, 顯然不現實。
最早我研究的是谷歌API, 不過谷歌在天朝, 大家都懂得...
然後是百度了,嘗試了下, 效果還不錯。 另外, 百度也有自己“以圖搜圖”對應的App。不過我們只是為了學會如何實現怎樣的功能, 管他呢。
所以,在以圖搜圖功能上, 我選擇了使用百度API,不過百度這個API只提供給他們的“百度輕拍”APP, 不對外開放,我也是通過輕拍抓到的API,然後進行分析。
好了, 接下去就是分析過程了。 demo之後會提供。
之後我們會采用 post方式, 獲取對應的json數據,但是這個請求裡面,要傳入 base64Encoding 編碼的 NSString (這裡放的是圖片信息)
(不要問我為什麼, 百度就是這樣設計的 )
UIImage* pic =[UIImage imageNamed:@test_1.png]; NSData* pictureData =UIImagePNGRepresentation(pic); NSString* pictureDataString =[pictureData base64Encoding];
這裡, 我抓到的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);
返回的數據很多, 大家感興趣可以自己逐一分析。
簡單的介紹下.
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 這裡的編碼是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在別處肯定是找不到的。
另外, 圖片搜索我們還可以拓展出好多知識,
比如 人臉識別,光學字符識別, 圖像文字識別....
以上提到的那3部分, 之前都有寫過相關demo。 不過最近忙著考試, 等以後有時間了再逐一分享。