ocr.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. # -*- coding: utf-8 -*-
  2. """
  3. 图像识别
  4. """
  5. import re
  6. import sys
  7. import math
  8. import time
  9. from .base import AipBase
  10. from .base import base64
  11. from .base import json
  12. from .base import urlencode
  13. from .base import quote
  14. class AipOcr(AipBase):
  15. """
  16. 图像识别
  17. """
  18. __generalBasicUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic'
  19. __accurateBasicUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic'
  20. __generalUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general'
  21. __accurateUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate'
  22. __generalEnhancedUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_enhanced'
  23. __webImageUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/webimage'
  24. __idcardUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/idcard'
  25. __bankcardUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/bankcard'
  26. __drivingLicenseUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/driving_license'
  27. __vehicleLicenseUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license'
  28. __licensePlateUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate'
  29. __businessLicenseUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/business_license'
  30. __receiptUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/receipt'
  31. __trainTicketUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/train_ticket'
  32. __taxiReceiptUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/taxi_receipt'
  33. __formUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/form'
  34. __tableRecognizeUrl = 'https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/request'
  35. __tableResultGetUrl = 'https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/get_request_result'
  36. __vinCodeUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/vin_code'
  37. __quotaInvoiceUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/quota_invoice'
  38. __householdRegisterUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/household_register'
  39. __HKMacauExitentrypermitUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/HK_Macau_exitentrypermit'
  40. __taiwanExitentrypermitUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/taiwan_exitentrypermit'
  41. __birthCertificateUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/birth_certificate'
  42. __vehicleInvoiceUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_invoice'
  43. __vehicleCertificateUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_certificate'
  44. __invoiceUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/invoice'
  45. __airTicketUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/air_ticket'
  46. __insuranceDocumentsUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/insurance_documents'
  47. __vatInvoiceUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice'
  48. __qrcodeUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/qrcode'
  49. __numbersUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/numbers'
  50. __lotteryUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/lottery'
  51. __passportUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/passport'
  52. __businessCardUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/business_card'
  53. __handwritingUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/handwriting'
  54. __customUrl = 'https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise'
  55. def basicGeneral(self, image, options=None):
  56. """
  57. 通用文字识别
  58. """
  59. options = options or {}
  60. data = {}
  61. data['image'] = base64.b64encode(image).decode()
  62. data.update(options)
  63. return self._request(self.__generalBasicUrl, data)
  64. def basicGeneralUrl(self, url, options=None):
  65. """
  66. 通用文字识别
  67. """
  68. options = options or {}
  69. data = {}
  70. data['url'] = url
  71. data.update(options)
  72. return self._request(self.__generalBasicUrl, data)
  73. def basicAccurate(self, image, options=None):
  74. """
  75. 通用文字识别(高精度版)
  76. """
  77. options = options or {}
  78. data = {}
  79. data['image'] = base64.b64encode(image).decode()
  80. data.update(options)
  81. return self._request(self.__accurateBasicUrl, data)
  82. def general(self, image, options=None):
  83. """
  84. 通用文字识别(含位置信息版)
  85. """
  86. options = options or {}
  87. data = {}
  88. data['image'] = base64.b64encode(image).decode()
  89. data.update(options)
  90. return self._request(self.__generalUrl, data)
  91. def generalUrl(self, url, options=None):
  92. """
  93. 通用文字识别(含位置信息版)
  94. """
  95. options = options or {}
  96. data = {}
  97. data['url'] = url
  98. data.update(options)
  99. return self._request(self.__generalUrl, data)
  100. def accurate(self, image, options=None):
  101. """
  102. 通用文字识别(含位置高精度版)
  103. """
  104. options = options or {}
  105. data = {}
  106. data['image'] = base64.b64encode(image).decode()
  107. data.update(options)
  108. return self._request(self.__accurateUrl, data)
  109. def enhancedGeneral(self, image, options=None):
  110. """
  111. 通用文字识别(含生僻字版)
  112. """
  113. options = options or {}
  114. data = {}
  115. data['image'] = base64.b64encode(image).decode()
  116. data.update(options)
  117. return self._request(self.__generalEnhancedUrl, data)
  118. def enhancedGeneralUrl(self, url, options=None):
  119. """
  120. 通用文字识别(含生僻字版)
  121. """
  122. options = options or {}
  123. data = {}
  124. data['url'] = url
  125. data.update(options)
  126. return self._request(self.__generalEnhancedUrl, data)
  127. def webImage(self, image, options=None):
  128. """
  129. 网络图片文字识别
  130. """
  131. options = options or {}
  132. data = {}
  133. data['image'] = base64.b64encode(image).decode()
  134. data.update(options)
  135. return self._request(self.__webImageUrl, data)
  136. def webImageUrl(self, url, options=None):
  137. """
  138. 网络图片文字识别
  139. """
  140. options = options or {}
  141. data = {}
  142. data['url'] = url
  143. data.update(options)
  144. return self._request(self.__webImageUrl, data)
  145. def idcard(self, image, id_card_side, options=None):
  146. """
  147. 身份证识别
  148. """
  149. options = options or {}
  150. data = {}
  151. data['image'] = base64.b64encode(image).decode()
  152. data['id_card_side'] = id_card_side
  153. data.update(options)
  154. return self._request(self.__idcardUrl, data)
  155. def bankcard(self, image, options=None):
  156. """
  157. 银行卡识别
  158. """
  159. options = options or {}
  160. data = {}
  161. data['image'] = base64.b64encode(image).decode()
  162. data.update(options)
  163. return self._request(self.__bankcardUrl, data)
  164. def drivingLicense(self, image, options=None):
  165. """
  166. 驾驶证识别
  167. """
  168. options = options or {}
  169. data = {}
  170. data['image'] = base64.b64encode(image).decode()
  171. data.update(options)
  172. return self._request(self.__drivingLicenseUrl, data)
  173. def vehicleLicense(self, image, options=None):
  174. """
  175. 行驶证识别
  176. """
  177. options = options or {}
  178. data = {}
  179. data['image'] = base64.b64encode(image).decode()
  180. data.update(options)
  181. return self._request(self.__vehicleLicenseUrl, data)
  182. def licensePlate(self, image, options=None):
  183. """
  184. 车牌识别
  185. """
  186. options = options or {}
  187. data = {}
  188. data['image'] = base64.b64encode(image).decode()
  189. data.update(options)
  190. return self._request(self.__licensePlateUrl, data)
  191. def businessLicense(self, image, options=None):
  192. """
  193. 营业执照识别
  194. """
  195. options = options or {}
  196. data = {}
  197. data['image'] = base64.b64encode(image).decode()
  198. data.update(options)
  199. return self._request(self.__businessLicenseUrl, data)
  200. def receipt(self, image, options=None):
  201. """
  202. 通用票据识别
  203. """
  204. options = options or {}
  205. data = {}
  206. data['image'] = base64.b64encode(image).decode()
  207. data.update(options)
  208. return self._request(self.__receiptUrl, data)
  209. def trainTicket(self, image, options=None):
  210. """
  211. 火车票识别
  212. """
  213. options = options or {}
  214. data = {}
  215. data['image'] = base64.b64encode(image).decode()
  216. data.update(options)
  217. return self._request(self.__trainTicketUrl, data)
  218. def taxiReceipt(self, image, options=None):
  219. """
  220. 出租车票识别
  221. """
  222. options = options or {}
  223. data = {}
  224. data['image'] = base64.b64encode(image).decode()
  225. data.update(options)
  226. return self._request(self.__taxiReceiptUrl, data)
  227. def form(self, image, options=None):
  228. """
  229. 表格文字识别同步接口
  230. """
  231. options = options or {}
  232. data = {}
  233. data['image'] = base64.b64encode(image).decode()
  234. data.update(options)
  235. return self._request(self.__formUrl, data)
  236. def tableRecognitionAsync(self, image, options=None):
  237. """
  238. 表格文字识别
  239. """
  240. options = options or {}
  241. data = {}
  242. data['image'] = base64.b64encode(image).decode()
  243. data.update(options)
  244. return self._request(self.__tableRecognizeUrl, data)
  245. def getTableRecognitionResult(self, request_id, options=None):
  246. """
  247. 表格识别结果
  248. """
  249. options = options or {}
  250. data = {}
  251. data['request_id'] = request_id
  252. data.update(options)
  253. return self._request(self.__tableResultGetUrl, data)
  254. def vinCode(self, image, options=None):
  255. """
  256. VIN码识别
  257. """
  258. options = options or {}
  259. data = {}
  260. data['image'] = base64.b64encode(image).decode()
  261. data.update(options)
  262. return self._request(self.__vinCodeUrl, data)
  263. def quotaInvoice(self, image, options=None):
  264. """
  265. 定额发票识别
  266. """
  267. options = options or {}
  268. data = {}
  269. data['image'] = base64.b64encode(image).decode()
  270. data.update(options)
  271. return self._request(self.__quotaInvoiceUrl, data)
  272. def householdRegister(self, image, options=None):
  273. """
  274. 户口本识别
  275. """
  276. options = options or {}
  277. data = {}
  278. data['image'] = base64.b64encode(image).decode()
  279. data.update(options)
  280. return self._request(self.__householdRegisterUrl, data)
  281. def HKMacauExitentrypermit(self, image, options=None):
  282. """
  283. 港澳通行证识别
  284. """
  285. options = options or {}
  286. data = {}
  287. data['image'] = base64.b64encode(image).decode()
  288. data.update(options)
  289. return self._request(self.__HKMacauExitentrypermitUrl, data)
  290. def taiwanExitentrypermit(self, image, options=None):
  291. """
  292. 台湾通行证识别
  293. """
  294. options = options or {}
  295. data = {}
  296. data['image'] = base64.b64encode(image).decode()
  297. data.update(options)
  298. return self._request(self.__taiwanExitentrypermitUrl, data)
  299. def birthCertificate(self, image, options=None):
  300. """
  301. 出生医学证明识别
  302. """
  303. options = options or {}
  304. data = {}
  305. data['image'] = base64.b64encode(image).decode()
  306. data.update(options)
  307. return self._request(self.__birthCertificateUrl, data)
  308. def vehicleInvoice(self, image, options=None):
  309. """
  310. 机动车销售发票识别
  311. """
  312. options = options or {}
  313. data = {}
  314. data['image'] = base64.b64encode(image).decode()
  315. data.update(options)
  316. return self._request(self.__vehicleInvoiceUrl, data)
  317. def vehicleCertificate(self, image, options=None):
  318. """
  319. 车辆合格证识别
  320. """
  321. options = options or {}
  322. data = {}
  323. data['image'] = base64.b64encode(image).decode()
  324. data.update(options)
  325. return self._request(self.__vehicleCertificateUrl, data)
  326. def invoice(self, image, options=None):
  327. """
  328. 税务局通用机打发票识别
  329. """
  330. options = options or {}
  331. data = {}
  332. data['image'] = base64.b64encode(image).decode()
  333. data.update(options)
  334. return self._request(self.__invoiceUrl, data)
  335. def airTicket(self, image, options=None):
  336. """
  337. 行程单识别
  338. """
  339. options = options or {}
  340. data = {}
  341. data['image'] = base64.b64encode(image).decode()
  342. data.update(options)
  343. return self._request(self.__airTicketUrl, data)
  344. def insuranceDocuments(self, image, options=None):
  345. """
  346. 保单识别
  347. """
  348. options = options or {}
  349. data = {}
  350. data['image'] = base64.b64encode(image).decode()
  351. data.update(options)
  352. return self._request(self.__insuranceDocumentsUrl, data)
  353. def vatInvoice(self, image, options=None):
  354. """
  355. 增值税发票识别
  356. """
  357. options = options or {}
  358. data = {}
  359. data['image'] = base64.b64encode(image).decode()
  360. data.update(options)
  361. return self._request(self.__vatInvoiceUrl, data)
  362. def qrcode(self, image, options=None):
  363. """
  364. 二维码识别
  365. """
  366. options = options or {}
  367. data = {}
  368. data['image'] = base64.b64encode(image).decode()
  369. data.update(options)
  370. return self._request(self.__qrcodeUrl, data)
  371. def numbers(self, image, options=None):
  372. """
  373. 数字识别
  374. """
  375. options = options or {}
  376. data = {}
  377. data['image'] = base64.b64encode(image).decode()
  378. data.update(options)
  379. return self._request(self.__numbersUrl, data)
  380. def lottery(self, image, options=None):
  381. """
  382. 彩票识别
  383. """
  384. options = options or {}
  385. data = {}
  386. data['image'] = base64.b64encode(image).decode()
  387. data.update(options)
  388. return self._request(self.__lotteryUrl, data)
  389. def passport(self, image, options=None):
  390. """
  391. 护照识别
  392. """
  393. options = options or {}
  394. data = {}
  395. data['image'] = base64.b64encode(image).decode()
  396. data.update(options)
  397. return self._request(self.__passportUrl, data)
  398. def businessCard(self, image, options=None):
  399. """
  400. 名片识别
  401. """
  402. options = options or {}
  403. data = {}
  404. data['image'] = base64.b64encode(image).decode()
  405. data.update(options)
  406. return self._request(self.__businessCardUrl, data)
  407. def handwriting(self, image, options=None):
  408. """
  409. 手写文字识别
  410. """
  411. options = options or {}
  412. data = {}
  413. data['image'] = base64.b64encode(image).decode()
  414. data.update(options)
  415. return self._request(self.__handwritingUrl, data)
  416. def custom(self, image, options=None):
  417. """
  418. 自定义模板文字识别
  419. """
  420. options = options or {}
  421. data = {}
  422. data['image'] = base64.b64encode(image).decode()
  423. data.update(options)
  424. return self._request(self.__customUrl, data)
  425. def tableRecognition(self, image, options=None, timeout=10000):
  426. """
  427. tableRecognition
  428. """
  429. result = self.tableRecognitionAsync(image)
  430. if 'error_code' in result:
  431. return result
  432. requestId = result['result'][0]['request_id']
  433. for i in range(int(math.ceil(timeout / 1000.0))):
  434. result = self.getTableRecognitionResult(requestId, options)
  435. # 完成
  436. if int(result['result']['ret_code']) == 3:
  437. break
  438. time.sleep(1)
  439. return result