使用百度AI圖像識別提供的API接口來搭建識圖工具,首先要註冊百度開發者帳號,而後找到圖像識別頁面,建立應用,申請成功後會給兩個重要的數據API Key ,Secret Key,這是實現識圖的重要參數,以動物識別爲例:json
獲取access_token接口app
import urllib, urllib2, sys import ssl # client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官網獲取的AK】&client_secret=【官網獲取的SK】' request = urllib2.Request(host) request.add_header('Content-Type', 'application/json; charset=UTF-8') response = urllib2.urlopen(request) content = response.read() if (content): print(content)
識別圖像接口ide
這是百度給的請求方法,返回的content是json數據格式,須要使用loads方法轉換爲Python對象,token的獲取也給了方法能夠調用工具
# encoding:utf-8 import base64 import urllib import urllib2 ''' 動物識別 ''' request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal" # 二進制方式打開圖片文件 f = open('[本地文件]', 'rb') img = base64.b64encode(f.read()) params = {"image":img,"top_num":6} params = urllib.urlencode(params) access_token = '[調用鑑權接口獲取的token]' request_url = request_url + "?access_token=" + access_token request = urllib2.Request(url=request_url, data=params) request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib2.urlopen(request) content = response.read() if content: print content
製做識圖工具使用Pyqt5這個模塊,也比較簡單佈局
import sys from PyQt5 import QtWidgets, QtCore from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtWidgets import QFileDialog import json import base64 import urllib import urllib.request """ 你的 APPID AK SK """ # http://ai.baidu.com/docs#/OCR-Pricing/top 申請地址 # API_KEY 爲官網獲取的AK, SECRET_KEY 爲官網獲取的SK API_KEY = 'API_KEY' SECRET_KEY = 'SECRET_KEY' #qt自動生成的UI類 class Ui_Form(object): def setupUi(self, Form): #設置窗體名稱 Form.setObjectName("Form") # 設置窗體大小 Form.resize(724, 489) # 建立顯示要識別圖片控件 self.image = QtWidgets.QLabel(Form) # 設置控件大小 self.image.setGeometry(QtCore.QRect(96, 140, 311, 301)) # 設置黑色邊框 self.image.setStyleSheet("border-width: 1px;border-style: solid;border-color: rgb(0, 0, 0);") # 設置圖片顯示控件名稱 self.image.setObjectName("image") # 建立窗體 self.widget = QtWidgets.QWidget(Form) # 窗體大小 self.widget.setGeometry(QtCore.QRect(110, 50, 221, 31)) # 設置名稱 self.widget.setObjectName("widget") # 建立佈局容器控件 self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) # 設置容器中內容邊距 self.horizontalLayout.setContentsMargins(0, 0, 0, 0) # 設置名稱 self.horizontalLayout.setObjectName("horizontalLayout") # 建立文字顯示控件 self.label = QtWidgets.QLabel(self.widget) # 設置名稱 self.label.setObjectName("label") # 把文字顯示控件添加到佈局容器中 self.horizontalLayout.addWidget(self.label) # 在窗體裏建立選擇內容控件 self.comboBox = QtWidgets.QComboBox(self.widget) # 設置名稱 self.comboBox.setObjectName("comboBox") # 添加子標題有多少分類添加幾個 self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") # 把下拉選擇控件添加到佈局容器中 self.horizontalLayout.addWidget(self.comboBox) # 建立窗體 self.widget1 = QtWidgets.QWidget(Form) # 建立窗體大小 self.widget1.setGeometry(QtCore.QRect(96, 90, 318, 31)) # 建立名稱 self.widget1.setObjectName("widget1") # 新建橫向佈局 self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget1) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.label_2 = QtWidgets.QLabel(self.widget1) self.label_2.setObjectName("label_2") self.horizontalLayout_2.addWidget(self.label_2) self.lineEdit = QtWidgets.QLineEdit(self.widget1) self.lineEdit.setObjectName("lineEdit") self.horizontalLayout_2.addWidget(self.lineEdit) # 新建按鈕 self.pushButton = QtWidgets.QPushButton(self.widget1) self.pushButton.setObjectName("pushButton") self.horizontalLayout_2.addWidget(self.pushButton) self.widget2 = QtWidgets.QWidget(Form) self.widget2.setGeometry(QtCore.QRect(450, 50, 201, 401)) self.widget2.setObjectName("widget2") self.verticalLayout = QtWidgets.QVBoxLayout(self.widget2) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.label_3 = QtWidgets.QLabel(self.widget2) self.label_3.setLayoutDirection(QtCore.Qt.LeftToRight) # 設置內容自動換行 self.label_3.setWordWrap(True) # 設置黑色邊框 self.label_3.setStyleSheet("border-width: 1px;border-style: solid;border-color: rgb(0, 0, 0);") self.label_3.setObjectName("label_3") self.verticalLayout.addWidget(self.label_3) self.pushButton_2 = QtWidgets.QPushButton(self.widget2) self.pushButton_2.setObjectName("pushButton_2") self.verticalLayout.addWidget(self.pushButton_2) # 自動生成的ui控件 處理方法 self.retranslateUi(Form) # 自動生成的 關聯信號槽 QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate # 設置窗體內容 Form.setWindowTitle(_translate("Form", "圖像識別工具")) # 設置文字控件顯示內容 self.label.setText(_translate("Form", "選擇識別類型:")) # 設置下拉控件選項內容 self.comboBox.setItemText(0, _translate("Form", "菜品")) self.comboBox.setItemText(1, _translate("Form", "植物")) self.comboBox.setItemText(2, _translate("Form", "動物")) self.comboBox.setItemText(3, _translate("Form", "通用物體和場景")) self.comboBox.setItemText(4, _translate("Form", "紅酒")) self.comboBox.setItemText(5, _translate("Form", "貨幣")) self.comboBox.setItemText(6, _translate("Form", "花卉")) self.comboBox.setItemText(7, _translate("Form", "果蔬類食材")) self.comboBox.setItemText(8, _translate("Form", "地標")) self.comboBox.setItemText(9, _translate("Form", "車型")) self.comboBox.setItemText(10, _translate("Form", "Logo")) # 設置控件顯示文字 self.label_2.setText(_translate("Form", "選擇要識別的圖片:")) # 設置按鈕顯示的文字 self.pushButton.setText(_translate("Form", "選擇...")) # 設置文本控件顯示內容 self.label_3.setText(_translate("Form", "顯示識別結果")) # 設置按鈕內容 self.pushButton_2.setText(_translate("Form", "複製到剪切版")) # 爲按鈕設置方法 self.pushButton.clicked.connect(self.openfile) # 爲按鈕設置點擊方法 self.pushButton_2.clicked.connect(self.copyText) # 複製文字到剪貼板方法 def copyText(self): # 複製文字到剪貼板 clipboard = QApplication.clipboard() # 設置複製的內容 clipboard.setText(self.label_3.text()) # 打開文件選擇對話框方法 def openfile(self): # 啓動選擇文件對話空,查找jpg以及png圖片 self.download_path = QFileDialog.getOpenFileName(self.widget1, "選擇要識別的圖片", "/", "Image Files(*.jpg *.png)") # 判斷是否選擇圖片 if not self.download_path[0].strip(): # 沒有選擇圖片 pass else: # 選擇圖片執行如下內容 # 設置圖片路徑 self.lineEdit.setText(self.download_path[0]) # 理由pixmap解析圖片 pixmap = QPixmap(self.download_path[0]) # 等比例縮放圖片 scaredPixmap = pixmap.scaled(QSize(311, 301), aspectRatioMode=Qt.KeepAspectRatio) # 設置圖片 self.image.setPixmap(scaredPixmap) # 判斷選擇的類型 根據類型作相應的圖片處理 self.image.show() # 判斷選擇的類型 self.typeTp() pass # 判斷選擇的類型 進行相應處理 def typeTp(self): # 菜品識別 if self.comboBox.currentIndex() == 0: #self.get_bankcard(self.get_token()) self.get_dishDetect(self.get_token()) pass # 植物識別 elif self.comboBox.currentIndex() == 1: self.get_plant(self.get_token()) pass # 動物識別 elif self.comboBox.currentIndex() == 2: self.get_animal(self.get_token()) pass #通用識別 elif self.comboBox.currentIndex() == 3: self.get_advanced_general(self.get_token()) pass # 紅酒識別 elif self.comboBox.currentIndex() == 4: self.get_redwine(self.get_token()) pass # 貨幣識別 elif self.comboBox.currentIndex() == 5: self.get_currency(self.get_token()) pass # 花卉識別 elif self.comboBox.currentIndex() == 6: self.get_flower(self.get_token()) pass # 果蔬類識別 elif self.comboBox.currentIndex() == 7: self.get_ingredient(self.get_token()) pass # 地標識別 elif self.comboBox.currentIndex() == 8: self.get_landmark(self.get_token()) pass # 車型識別 elif self.comboBox.currentIndex() == 9: self.get_car(self.get_token()) pass # Logo識別 elif self.comboBox.currentIndex() == 10: self.get_logo(self.get_token()) pass pass # 百度提供方法 獲取token def get_token(self): # client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + API_KEY + '&client_secret=' + SECRET_KEY # 發送請求 request = urllib.request.Request(host) # 添加請求頭 request.add_header('Content-Type', 'application/json; charset=UTF-8') # 獲取返回內容 response = urllib.request.urlopen(request) # 讀取返回內容 content = response.read() # 判斷內容是否爲空 if (content): # 打印內容 print(content) # 打印token print(json.loads(content)['access_token']) # 使用json解析出token 設置token self.access_token = json.loads(content)['access_token'] # 返回token return self.access_token #菜品識別 def get_dishDetect(self, access_token): request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/dish" # 二進制方式打開圖片文件 f = self.get_file_content(self.download_path[0]) img = base64.b64encode(f) params = {"image": img,"top_num":5} params = urllib.parse.urlencode(params).encode('utf-8') request_url = request_url + "?access_token=" + access_token request = urllib.request.Request(url=request_url, data=params) request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib.request.urlopen(request) content = response.read() if content: # 解析返回數據 dishDetect = json.loads(content) # 輸出返回結果 strover = '識別結果:\n' # 捕捉異常判斷是否正確返回信息 try: # i = 1 # for dish in dishDetect['result']: # strover += '{} 菜名:{} \n 卡路里:{} \n'.format(i, dish['name'], dish['calorie']) # i += 1 dish_result=dishDetect['result'] # 名稱 name = dish_result[0]['name'] strover += ' 名稱:\n {} \n '.format(name) # 能量 calorie = dish_result[0]['calorie'] strover += ' 卡路里:{} \n '.format(calorie) # 錯誤的時候提示錯誤緣由 except BaseException: error_msg = dish_result['error_msg'] strover += ' 錯誤:\n {} \n '.format(error_msg) # 設置識別顯示結果 self.label_3.setText(strover) # 1植物識別 def get_plant(self, access_token): request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant" # 二進制方式打開圖片文件 f = self.get_file_content(self.download_path[0]) # 轉換圖片 img = base64.b64encode(f) # 拼接圖片參數 params = {"image": img} params = urllib.parse.urlencode(params).encode('utf-8') # 請求地址 request_url = request_url + "?access_token=" + access_token # 發送請求傳遞圖片參數 request = urllib.request.Request(url=request_url, data=params) # 添加訪問頭部 request.add_header('Content-Type', 'application/x-www-form-urlencoded') # 接收返回內容 response = urllib.request.urlopen(request) # 讀取返回內容 content = response.read() #print(content) # 內容判斷 if content: plants = json.loads(content) strover = '識別結果:\n' try: i = 1 for plant in plants['result']: strover += '{} 植物名稱:{} \n'.format(i, plant['name']) i += 1 except BaseException: error_msg = plants['error_msg'] strover += ' 錯誤:\n {} \n '.format(error_msg) self.label_3.setText(strover) # 2動物識別 def get_animal(self, access_token): request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal" # 二進制方式打開圖片文件 f = self.get_file_content(self.download_path[0]) img = base64.b64encode(f) params = {"image": img, "top_num": 6} params = urllib.parse.urlencode(params).encode('utf-8') request_url = request_url + "?access_token=" + access_token request = urllib.request.Request(url=request_url, data=params) request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib.request.urlopen(request) content = response.read() if content: animals = json.loads(content) strover = '識別結果:\n' try: i = 1 for animal in animals['result']: strover += '{} 動物名稱:{} \n'.format(i, animal['name']) i += 1 except BaseException: error_msg = animals['error_msg'] strover += ' 錯誤:\n {} \n '.format(error_msg) self.label_3.setText(strover) # 3 通用物體識別 def get_advanced_general(self, access_token): request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general" # 二進制方式打開圖片文件 f = self.get_file_content(self.download_path[0]) img = base64.b64encode(f) params = {"image": img} params = urllib.parse.urlencode(params).encode('utf-8') request_url = request_url + "?access_token=" + access_token request = urllib.request.Request(url=request_url, data=params) request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib.request.urlopen(request) content = response.read() if content: general_result = json.loads(content) strover = '識別結果:\n' try: i=1 for general in general_result['result']: #票據內容 root =general['root'] keyword=general['keyword'] strover += '{} 物體標籤:{} \n 物體名稱:{} \n'.format(i, root, keyword) i+=1 except BaseException: error_msg = general_result['error_msg'] strover += ' 錯誤:\n {} \n '.format(error_msg) self.label_3.setText(strover) #4紅酒識別 def get_redwine(self,access_token): request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/redwine" # 二進制方式打開圖片文件 f = self.get_file_content(self.download_path[0]) img = base64.b64encode(f) params = {"image": img} params = urllib.parse.urlencode(params).encode('utf-8') request_url = request_url + "?access_token=" + access_token request = urllib.request.Request(url=request_url, data=params) request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib.request.urlopen(request) content = response.read() if content: redwine = json.loads(content) strover = '識別結果:\n' hasdetail=redwine['result']['hasdetail'] try: wine_result=redwine['result'] if hasdetail==0: #print(wine_result) wineNameCn = wine_result['wineNameCn'] strover += ' 名稱:\n {} \n '.format(wineNameCn) else: # 紅酒名稱 wine_name = wine_result['subRegionCn'] strover += ' 名稱:\n {} \n '.format(wine_name) # 紅酒品牌 wineNameCn = wine_result['wineNameCn'] strover += ' 品牌:{} \n '.format(wineNameCn) # 顏色 color = wine_result['color'] strover += ' 顏色:{} \n '.format(color) # 類型 classifyBySugar = wine_result['classifyBySugar'] strover += ' 類型:{} \n '.format(classifyBySugar) # 溫度 tasteTemperature = wine_result['tasteTemperature'] strover += ' 溫度:{} \n '.format(tasteTemperature) # 地址 countryCn = wine_result['countryCn'] strover += ' 地址:\n{}\n '.format(countryCn) #描述 description = wine_result['description'] strover += ' 描述:\n{}\n '.format(description) except BaseException: error_msg=wine_result['error_msg'] strover += ' 錯誤:\n {} \n '.format(error_msg) self.label_3.setText(strover) # #5 貨幣識別 def get_currency(self, access_token): request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/currency" # 二進制方式打開圖片文件 f = self.get_file_content(self.download_path[0]) img = base64.b64encode(f) params = {"image": img} params = urllib.parse.urlencode(params).encode('utf-8') request_url = request_url + "?access_token=" + access_token request = urllib.request.Request(url=request_url, data=params) request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib.request.urlopen(request) content = response.read() if content: currency = json.loads(content) strover = '識別結果:\n' try: currency_result = currency['result'] currencyName = currency_result['currencyName'] strover += ' 貨幣類型:\n{} \n '.format(currencyName) # 民族 year = currency_result['year'] strover += ' 年份:{} \n '.format(year) # 面值 currencyDenomination = currency_result['currencyDenomination'] strover += ' 姓名:{} \n '.format(currencyDenomination) except BaseException: error_msg = currency_result['error_msg'] strover += ' 錯誤:\n {} \n '.format(error_msg) # 顯示識別結果 self.label_3.setText(strover) # 讀取圖片 def get_file_content(self, filePath): with open(filePath, 'rb') as fp: return fp.read() # 程序主方法 if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() # 初始化窗體 ui = Ui_Form() # 調用建立窗體方法 ui.setupUi(MainWindow) # 顯示窗體 MainWindow.show() sys.exit(app.exec_())