Python을 사용하여 XX 온라인 플랫폼에서 비디오 학습을 위한 방과 후 시험을 완료하는 데 도움이 되는 답안 은행을 생성합니다.


머리말

XX 온라인 비디오 학습 과제가 증가함에 따라 때때로 비디오를 본 후 방과 후 시험을 완료하는 것이 쉽지 않은 경우가 있습니다.이 기사는 Python을 사용하여 솔루션과 코드를 제공하고 시험을 원활하게 통과할 수 있는 실행 가능한 솔루션을 제공하고자 합니다.


생각의 기차

비디오 사진을 가로채서 규칙에 따라 조건에 맞는 사진을 선택한 다음 OCR을 사용하여 선별된 사진을 식별하고 최종적으로 사진 링크가 포함된 Excel 답안 라이브러리 파일을 생성합니다. 일반적으로 스크린샷, 사진 선택, 사진 인식, 답안지 생성의 네 부분으로 나뉩니다.


라이브러리 및 전역 변수 가져오기

import os
import cv2
import shutil
import openpyxl as op
import time
import easyocr
filepath= r'D:\moocxuetang'#自定义文件存放位置
videopath = r'D:\moocxuetang\video'#自定义视频存放位置
picpath=r'D:\moocxuetang\picture'#自定义截图存放位置
picchoosepath = filepath + '\\' + 'picture_choose'#自定义选图存放位置
txt=[]#图片识别列表
hylink=[]#图片链接位置列表

1. 스크린샷

스크린샷 참조 기사: Python을 사용하여 비디오 프레임 속도로 재생
스크린샷 참조 기사: Python CV2 함정을 피하기 위한
상세 가이드
실제로 저장되지 않습니다.
아래와 같이 코드 쇼:

# 截取单个视频文件图片
def get_pic(videoname='1.1XXXXX.mp4'):
    videoname = videoname
    video = cv2.VideoCapture(videopath+'\\'+videoname)
    ###########获取视频信息(帧率,分辨率,总帧数,时长)##############
    # 帧率
    fps = int(round(video.get(cv2.CAP_PROP_FPS)))
    # 分辨率-宽度
    width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
    # 分辨率-高度
    height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    # 总帧数
    frame_counter = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    # 时长,单位s
    duration = frame_counter / fps
    print('帧率:%s' % fps)
    print('分辨率-宽度:%s' % width)
    print('分辨率-高度:%s' % height)
    print('总帧数:%s' % frame_counter)
    print('总时长:%s秒' % duration)
    ####################根据视频信息截取图片#####################
    i = 0
    j = 0
    while True:
        i += 1
        flag, frame = video.read()#读取视频
        if flag:
            if i % (fps*4) == 0:#间隔4秒截图1张
                j+=1
                picname=videoname[0:3]+'.'+str(j)+'.jpg'#根据视频文件名自行调整,将截图数量加到图片文件名中,方便后续查找
                cv2.imwrite(picpath+'\\'+picname, frame)#保存截图
                print('%s保存完毕!'%picname)
        else:
            break
    video.release()#视频释放
    print('视频关键帧截图完毕!!!')
#遍历视频文件,截取所有视频文件图片
def cut():
    ###########建立视频截图文件夹####################
    if not os.path.exists(picpath):#判断是否存在截图文件夹,不存在则建立文件夹
        os.makedirs(picpath)
        print('视频截图文件夹已建立')
    else: #存在则清空再建立文件夹
        shutil.rmtree(picpath)
        os.makedirs(picpath)
        print('原有图片已清除,已建立新的视频截图文件夹')
    videonames = os.listdir(videopath)
    start_time = time.time()
    for videoname in videonames:
        get_pic(videoname)
    end_time = time.time()
    t = (end_time - start_time) / 60 #记录截图总共用时多少分钟
    print('截图总共用时%s分钟' % str(round(t)))

2. 사진 선택

이미지 선택 참조 문서: OpenCV—Python 이미지 지정 영역 자르기

아래와 같이 코드 쇼:

#对单张图片进行规则化选取,满足条件则保存到选图文件夹
def pic_choose(picfullname=r'D:\XXXX\picture\1.1.92.jpg',picchoosepath=r'D:\XXXX\picture_choose'):
    picfullname = picfullname #单张图片的全路径名称,例如:'D:\XXXX\picture\1.1.92.jpg'
    picchoosepath=picchoosepath #选图文件夹的位置,例如:'D:\XXXX\picture_choose'
    picname=picfullname.split('\\')[-1] #单张图片的名称,例如:'1.1.92.jpg'
    ################将图片以灰度图片导入,找出符合规则的图片,裁剪适当位置并保存灰度图片到选图文件夹#############
    pic=cv2.imread(picfullname,cv2.IMREAD_GRAYSCALE) #将图片以灰度图片导入
    if abs(pic[59][40]-pic[59][45])<10 and abs(pic[59][45]-pic[59][50])<10 and abs(pic[59][50]-pic[59][55])<10 and abs(pic[59][55]-pic[59][60])<10 and abs(pic[59][60]-pic[59][65])<10 \
        and abs(pic[59][40]-pic[79][40]) >100  and abs(pic[59][45]-pic[79][45]) >100 and abs(pic[59][50]-pic[79][50]) >100  and abs(pic[59][55]-pic[79][55]) >100 and abs(pic[59][60]-pic[79][60]) >100 and abs(pic[59][65]-pic[79][65]) >100: #找出符合规则的图片
        cv2.imwrite(picchoosepath+'\\'+picname,pic[43:,:]) #裁剪适当位置并保存灰度图片到选图文件夹
    elif abs(pic[59][40]-pic[59][45])<10 and abs(pic[59][45]-pic[59][50])<10 and abs(pic[59][50]-pic[59][55])<10 and abs(pic[59][55]-pic[59][60])<10 and abs(pic[59][60]-pic[59][65])<10 \
        and abs(pic[59][40]-pic[79][40]) >50  and abs(pic[59][45]-pic[79][45]) >50 and abs(pic[59][50]-pic[79][50]) >50 and abs(pic[59][55]-pic[79][55]) >50 and abs(pic[59][60]-pic[79][60]) >50 and abs(pic[59][65]-pic[79][65]) >50:  #找出符合规则的图片
        cv2.imwrite(picchoosepath+'\\'+picname,pic[43:,:]) #裁剪适当位置并保存灰度图片到选图文件夹
#遍历截图文件夹,对所有图片进行规则化筛选
def choose():
    ############创建选图文件夹#####################
    if not os.path.exists(picchoosepath):#判断是否存在截图文件夹,不存在则建立文件夹
        os.makedirs(picchoosepath)
        print('选图文件夹已建立')
    else: #存在则清空再建立文件夹
        shutil.rmtree(picchoosepath)
        os.makedirs(picchoosepath)
        print('原有图片已清除,已建立新的选图文件夹')
    start_time = time.time()
    picnames = os.listdir(picpath)
    m = 0
    for picname in picnames:
        picfullname = picpath + '\\' + picname
        m += 1
        print('开始选图:第%s张' % m)
        pic_choose(picfullname)
    end_time = time.time()
    t = (end_time - start_time) / 60
    print('选图完成,用时%s分钟!!!' % t) #记录选图总共用时多少分钟
    picchoosenames = os.listdir(picchoosepath)
    print('共选出%s张图片'%len(picchoosenames)) #记录总共选图过少张

3. 사진 인식

이미지 인식에 대한 참조 문서: 초보자에게 적합한 여러 엔트리 레벨 Python ocr 인식 라이브러리
이미지 인식에 대한 참조 문서: easycr 빠른 설치 및 이미지 텍스트 추출 데모(작은 언어)
easycr 기술 문서

구덩이 회피 가이드
그림 참조 기사에 따르면 중국어를 인식할 수 있는 라이브러리는 3개입니다.
1. pytesseract
pytesseract는 로컬에 설치된 tesseract-ocr.exe 파일과 함께 사용해야 합니다. 중국어에 대한 인식이 매우 안좋고 처음 사용할때는 기본적으로 쓸모가 없습니다.
2. PaddleOCR
PaddleOCR은 Baidu에서 공개한 딥 러닝 기반 OCR 인식 라이브러리로, 중국어 인식 정확도가 매우 우수하여 대부분의 텍스트 추출 요구를 충족할 수 있습니다. 3개의 라이브러리를 설치해야 하고 종속 라이브러리가 많으며 버전이 맞지 않으면 작동하지 않고 다운로드가 느려집니다.오랫동안 던지다가 여전히 포기를 선택합니다.
3.
easyocr github에서 별 10,000개 이상을 기록한 오픈 소스 OCR 프로젝트는 80개 이상의 언어 인식을 지원하며 인식 정확도가 매우 높습니다. 최종 선택을 위해 기사에 자세히 설명된 대로 craft_mlt_25k.zip(텍스트 감지 모델), zh_sim_g2.zip(중국어 모델), english_g2.zip(영어 모델)을 다운로드해야 합니다.

제안:
1. Tsinghua 미러 소스를 사용하고 pip https://pypi.tuna.tsinghua.edu.cn/simple 사용 시 매개변수 -i 추가
2. 라이브러리를 다운로드할 때 버전 문제가 발생합니다. 3.
컴퓨터가 모델을 느리게 다운로드하는 경우 휴대폰으로 다운로드를 시도할 수 있습니다.
코드는 다음과 같습니다.

#使用easyocr库对单张图片识别,单张识图时间大约6秒(根据个人电脑情况)
def easy_ocr(picchoosefullname=r'D:\XXXX\picture_choose\1.1.100.jpg'):
    picchoosefullname = picchoosefullname #选图文件夹中的图片全路径名称,例如:'D:\XXXX\picture_choose\1.1.100.jpg'
    reader = easyocr.Reader(['ch_sim'],gpu=False) # 没有gpu的话需要加上gpu=False
    result = reader.readtext(picchoosefullname,detail=0,batch_size=32) #参数设置可以参考技术文档,batch_size=32试验了一下,比默认设置快大约1秒
    print(result)
    txt.append(''.join(result)) #将识别的文本合并为一项
    print(txt)
    return txt
#遍历选图文件夹,对所有图片进行识别
def know():
    start_time = time.time()
    picchoosenames = os.listdir(picchoosepath)
    n=0
    for picchoosename in picchoosenames:
        picchoosefullname = picchoosepath+'\\'+picchoosename
        n+=1
        print('开始识图:第%s张'%n)
        txt=easy_ocr(picchoosefullname) #获取图片识别列表
        hylink.append(picchoosefullname) #获取图片链接位置列表
    print('列表长度为:',len(txt))
    print('类型为',type(txt))
    end_time = time.time()
    t = (end_time - start_time) / 60
    print('识图完成,用时%s分钟!!!' % t) #记录识图总共用时多少分钟

넷째, 답변 라이브러리 생성

아래와 같이 코드 쇼:

def answer():
    print('开始创建答题库。。。')
    answer_path=r'D:\XXXX\answer.xlsx' #自定义答题库Excel路径,提前建好answer.xlsx文件
    wb = op.load_workbook(answer_path) #读入文件
    sheet = wb['Sheet1']
    sheet.delete_cols(1,1) #清空原有数据
    for i in range(len(txt)):
        sheet.cell(i+1,1,txt[i]) #将图片识别列表写入第1列
        sheet.cell(i+1,1,txt[i]).hyperlink=hylink[i]  #将图片链接位置列表写入对应位置
    wb.save(answer_path)
    f = open(r'D:\XXXX\answer.txt', 'w') #自定义答题库文本路径,提前建好answer.txt文件(避免Excel出错,导致全功尽弃的备份手段)
    p=0
    for line in txt:
        p+=1
        f.write('第'+str(p)+'张'+'\n'+line + '\n')
    f.close()
    print('答题库已生成!!!')


전체 코드

import os
import cv2
import shutil
import openpyxl as op
import time
import easyocr
filepath= r'D:\moocxuetang'#自定义文件存放位置
videopath = r'D:\moocxuetang\video'#自定义视频存放位置
picpath=r'D:\moocxuetang\picture'#自定义截图存放位置
picchoosepath = filepath + '\\' + 'picture_choose'#自定义选图存放位置
txt=[]#图片识别列表
hylink=[]#图片链接列表
#批量更改文件名(加上后缀.mp4),文章没介绍
def Renamevideo():
    videonames = os.listdir(videopath)
    for videoname in videonames:
        oldvideoname = videopath + '\\' + videoname
        newvideoname = oldvideoname + '.mp4'
        os.rename(oldvideoname, newvideoname)
        print(newvideoname)

def get_pic(videoname='1.1XXXXX.mp4'):
		pass #前文有,不再重复
def cut():
		pass #前文有,不再重复
def pic_choose(picfullname=r'D:\XXXX\picture\1.1.92.jpg',picchoosepath=r'D:\XXXX\picture_choose'):
		pass #前文有,不再重复
def choose():
		pass #前文有,不再重复
def easy_ocr(picchoosefullname=r'D:\XXXX\picture_choose\1.1.100.jpg'):
		pass #前文有,不再重复
def know():
		pass #前文有,不再重复
def answer():
		pass #前文有,不再重复

if __name__ == '__main__':
    cut()
    choose()
    know()
    answer()


최종 효과

폴더의 최종 내용:
폴더에 최종적으로 포함되는 내용
답변 은행 쿼리를 통해 성공적으로 시험에 통과:

여기에 이미지 설명 삽입

저자의 언어

다년간의 성매매와 사회환원의 자세 로 이 글을 쓰게 되었습니다 도움이 되셨기를 바라며 미흡한 부분이 있더라도 양해부탁드립니다. 대답하기 위해 최선을 다할 것입니다.

Guess you like

Origin blog.csdn.net/weixin_43704123/article/details/125249520