利用百度api进行文字识别

首先看看待识别的图片所在文件夹和图片本身是什么样:
利用百度api进行文字识别_第1张图片

我们要识别的是每张图片里的日期、前10名的艺人的姓名和粉丝人数

from aip import AipOcr
APP_ID = 'XXXX'
API_KEY = 'XXXX'
SECRET_KEY = 'XXXX'
client = AipOcr(appId=APP_ID,apiKey=API_KEY,secretKey=SECRET_KEY)

from PIL import Image
import time
import xlwt
#import xlrd
#from xlutils.copy import copy

APP_ID\API_KEY\SECRET_KEY登录百度智能云获得
利用百度api进行文字识别_第2张图片

date_list = []
name_list = []
fan_num_list = []
start = 0
for i in range(start,start+35):  #每次识别35张图片
    img = Image.open('./pic/{}.jpg'.format(i)) #截取图片中的日期部分
    date = img.crop((100,100,320,150)).save('date.jpg')
    date = (client.basicGeneral(open('date.jpg','rb').read())).get('words_result')[0]['words'] #进行图片识别,并拿到识别结果
    if '年' in date and '月' in date and '日' in date: #这个条件保证我们识别的是日榜的图片,而不是周榜、月榜的图片
        date_list.append(date)

        name_in_oneday = []
        fan_num_in_oneday = []
        for j in range(10):  #10:只要每张图片里前10个艺人的信息
            name_box = (150,270+j*106.7,260,295+j*106.7)
            name = img.crop((name_box)).save('name.jpg')
            name = client.basicGeneral(open('name.jpg','rb').read())
            name = name.get('words_result')
            if name == []:  #如果未识别出该艺人的姓名
                name_in_oneday.append('未识别出')
                print('name',i,date,j+1)
            else:
                name_in_oneday.append(name[0]['words'])
            time.sleep(1)
        
        for j in range(10):            
            fan_num_box = (500,288+j*106.7,600,313+j*106.7)
            fan_num = img.crop((fan_num_box)).save('fan_num.jpg')            
            fan_num = client.basicGeneral(open('fan_num.jpg','rb').read())
            fan_num = fan_num.get('words_result')
            if fan_num==[]:
                fan_num_in_oneday.append(0)
                print('fan_num',i,date,j+1)
            else:
                fan_num_in_oneday.append(fan_num[0]['words'])
            time.sleep(1)
        
        
        name_list.append(name_in_oneday)
        fan_num_list.append(fan_num_in_oneday)
#一个workbook里建立5张sheet 每张sheet包含一周(7天)的信息
workbook = xlwt.Workbook(encoding='utf-8')
sheet1 = workbook.add_sheet('sheet1')
sheet2 = workbook.add_sheet('sheet2')
sheet3 = workbook.add_sheet('sheet3')
sheet4 = workbook.add_sheet('sheet4')
sheet5 = workbook.add_sheet('sheet5')
sheet_list = [sheet1,sheet2,sheet3,sheet4,sheet5]
for sheet in sheet_list:
    sheet.write(0,0,'date')
    sheet.write(0,1,'name')
    sheet.write(0,2,'fan_num')
    
    
for sheet_num in range(len(sheet_list)):
    sheet = sheet_list[sheet_num]
    for i in range(7): #7:一周7天
        for j in range(10): #10:每天10个艺人的信息
            sheet.write(10*i+j+1,0,date_list[sheet_num*7+i])
            sheet.write(10*i+j+1,1,name_list[sheet_num*7+i][j])
            try:
                fan_num = int(fan_num_list[sheet_num*7+i][j].replace(',','').replace('.','').replace(':','').replace('、',''))
            except:
                fan_num = fan_num_list[sheet_num*7+i][j]
            sheet.write(10*i+j+1,2,fan_num)


workbook.save('workbook1.xls')

1.为什么每次只识别35张图片?
-这是百度api和电脑本身的性能决定的。多次实验发现,图片数目多了的话,识别的准确率会降低,并且容易报错。如果你想识别70张图片,
那么就运行两次,第二个workbook保存为workbook2.xls就可以。

2.为什么艺人的姓名和粉丝人数要一个一个地切割出来识别,不能一张图片里所有艺人的信息同时识别吗?
-可以同时识别,但是有时识别出来的准确率超级低,保险起见,我们就一个一个切割出来之后再识别

3.为什么要time.sleep?
-也是这个api和电脑本身性能决定的。多次实验发现,连续进行识别时,容易报错;但是每次识别后歇一下,报错的概率大大下降(我也不知道为什么)

利用百度api进行文字识别_第3张图片

你可能感兴趣的:(Python零碎知识点)