王德貴
踏青時看到很多美麗的花卻不知道名字……感覺很尷尬。于是我便想到用手機APP識別植物,顯示出各種花草的名字、介紹,這樣既解決了尷尬也學到了知識。
應用主要是通過調用百度智能云的植物識別API接口,向API服務地址使用POST請求和GET請求獲取相關數據,試驗證明大多數花草都能識別(圖1)。

開發這個程序,會從簡單到復雜,功能逐漸完善,后續還會在此程序基礎上添加更多識別種類,敬請關注。
1.首先要在百度智能云申請Apikey和Secretkey。之前的文章已經介紹過,這里不再贅述。
2.HTTP協議與GET、POST請求。
HTTP:超文本傳輸協議
HTTP 的工作方式是客戶機與服務器之間的請求-響應協議,通過協議保證客戶機與服務器之間的正常通信。常見的Web 瀏覽器就是客戶機,而計算機上的網絡應用程序也能作為服務器端。
兩種 HTTP 請求方法:GET 和 POST
在客戶機和服務器之間進行請求-響應時,兩種最常被用到的方法是GET 和 POST:
GET - 從指定的資源請求數據。
POST - 向指定的資源提交要被處理的數據,處理后返回對應的數據(圖2)。

本程序使用wxbit在線版(app.wxbit.com)(圖3)。

1.變量和初始化
變量Apikey和Secretkey存儲申請獲得的兩個KEY。
初始化程序利用Apikey和Secretkey,通過HTTP客戶端1GET請求的實時申請,得到JSON文本,然后將返回的JSON保存在列表Access_token_list中,再提取令牌值保存在變量Access_token中。

請求網址格式為(需要替換你的Apikey和Scretkey):
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【你的Apikey】&client_secret=【你的Scretkey】

請求頭格式如下(Header如下):
列表變量returnplant、plantlist、highscoreplant和baike分別存儲通過HTTP客戶端2POST請求返回的JSON文本、植物列表、最高置信度的植物列表和相關的百科簡介。變量image存儲植物照片(圖4)。

2.GET請求文本處理
初始化GET請求成功后,獲得的JSON文本保存起來,并提取令牌口令,保存在變量Access_token中備用(圖5)。

3.重設圖片尺寸函數
由于照片大小不一,識別過程可能會很長,將圖片的最大寬度改為500像素,高度按比例調整。
這里需要導入一個圖像處理插件TaifunImage.aix,可以百度搜索在網上下載(圖6、圖7)。


4.選擇植物圖片
將需要識別的植物圖片導入圖像組件中,調整大小后,顯示出來,同時清空上一次識別植物的所有數據(圖8)。

5. 拍照植物圖片
通過手機的拍照功能,對植物直接拍照,注意一定盡量清晰,對比度適中,否則會影響識別。拍攝完成后,處理圖片過程與選擇圖片一樣(圖9)。

6. 開始識別
將圖片路徑中的無用字符清除,作為HTTP客戶端2的POST請求地址。請求地址有格式要求,必須有請求頭和令牌口令才能請求成功。
POST請求網址(用變量access_token替換):
https://aip.baidubce.com/rest/2.0/image-
classify/v1/plant?access_token=【access_token令牌口令(GET請求獲得)】
POST請求時,必須將植物圖片轉換成BASE64編碼,存儲在HTTP客戶端創建的列表中,然后通過HTTP客戶端2獲取這些數據后,進行處理和提取,得到我們想要的有用數據。
BASE64編碼是數據傳輸中常用的編碼,以前有相關文章介紹。SimpleImage.aix組件是BASE64編碼插件,需要去網上下載,導入后即可使用。也就是說,POST請求數據時,是按照BASE64編碼請求的(如圖10)。

7.POST請求獲得文本
如果請求成功(響應代碼為200),返回參數如圖11(3個層級)。將返回的數組解碼為JSON文本,保存在列表變量returnplant中。然后將識別結果存儲在列表plantlist中,它包括所有置信度的植物信息,即識別的種類可能很多,但置信度(也可以理解為可信度)不同,其值從高到低排列,我們只取置信度最高的一項,存儲在列表highscoreplant中。并從中提取植物的名字和置信度值,在文本中顯示出來。

在列表highscoreplant中還有相關百科知識,只是列表維度太高,提取時稍有難度。百科簡介顯示出來,從中也能學到很多相關知識(圖12)。

邊寫代碼邊調試,以保證每一步的正確性。最后優化程序設計和UI設計。本例重點在處理數據列表時,稍微復雜一點。檢索數據時,需要一步步測試,才能了解數組(列表或字典)的意義。相關代碼和素材請在壹零社下載。