版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机视觉--OpenCV图像处理教程第八章文字识别OPTICALCHARACTERRECOGNITION内容要点:OpenCV神经网络库与手写文字识别、百度Paddle库介绍、百度PaddleOCR库安装、火车票识别、车牌识别、环形文字识别建议课时:8课时讲课人:宋桂岭讲课时间:2026年5月18日目录8.1手写数字识别理论+实操8.2Paddle文字识别理论+实操8.3车牌识别理论+实操8.4镜头规格识别项目实战8.5小结及作业总结作业018.1手写数字识别理论+实操8.1.1人工神经网络人工神经网络ArtificialNeuralNetworkOpenCV的人工神经网络(ANN)是机器学习算法中的其中一种,使用的是多层感知器(Multi-LayerPerception,MLP),是常见的一种ANN算法。MLP算法由一个输入层,一个输出层和一个或多个隐藏层组成。每一层由一个或多个神经元互相连结。MLP算法由一个输入层,一个输出层和一个或多个隐藏层组成。每一层由一个或多个神经元互相连结。一个“神经元”的输出就可以是另一个“神经元”的输入。8.1.1人工神经网络人工神经网络ArtificialNeuralNetworkOpenCV的人工神经网络(ANN)是机器学习算法中的其中一种,使用的是多层感知器(Multi-LayerPerception,MLP),是常见的一种ANN算法。MLP算法由一个输入层,一个输出层和一个或多个隐藏层组成。每一层由一个或多个神经元互相连结。在MLP算法中,每个神经元通过输入权重加上偏置计算输出值,并选择一种激励函数进行转换8.1.1人工神经网络人工神经网络ArtificialNeuralNetworkOpenCV的人工神经网络(ANN)是机器学习算法中的其中一种,使用的是多层感知器(Multi-LayerPerception,MLP),是常见的一种ANN算法。MLP算法由一个输入层,一个输出层和一个或多个隐藏层组成。每一层由一个或多个神经元互相连结。激励函数常见的有三种,分别是恒等函数,Sigmoid函数和高斯函数,OpenCV默认的是Sigmoid函数:
8.1.2手写数字识别①下载数据集:MNIST手写数据集示例fromkeras.datasetsimportmnistfromkerasimportutilsimportcv2importnumpyasnpfrommatplotlibimportpyplotasplt#直接使用Keras载入的训练数据(60000,28,28)(60000,)(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
#查看MNIST数据结构print(train_images.shape,test_images.shape)print(train_images[1])print(train_labels[1])plt.imshow(train_images[1])plt.show()8.1.2手写数字识别②创建神经网络:#opencv中ANN定义神经网络层defcreate_ANN():ann=cv2.ml.ANN_MLP_create()#设置神经网络层的结构
输入层为784隐藏层为80输出层为10(10个数字)ann.setLayerSizes(np.array([784,64,10]))#设置网络参数为误差反向传播法ann.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP)#设置激活函数为sigmoidann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM)#设置训练迭代条件
#结束条件为训练100次或者误差小于0.00001ann.setTermCriteria((cv2.TermCriteria_EPS|cv2.TermCriteria_COUNT,100,0.0001))returnann8.1.2手写数字识别③识别率判断函数:#计算测试数据上的识别率defevaluate_acc(ann,test_images,test_labels):#采用的sigmoid激活函数,需要对结果进行置信度处理
#对于大于0.99的可以确定为1对于小于0.01的可以确信为0test_ret=ann.predict(test_images)#预测结果是一个元组test_pre=test_ret[1]#可以直接最大值的下标(10000,)test_pre=test_pre.argmax(axis=1)true_sum=(test_pre==test_labels)returntrue_sum.mean()8.1.2手写数字识别④训练及评价:#直接使用Keras载入的训练数据(60000,28,28)(60000,)(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
#变换数据的形状并归一化train_images=train_images.reshape(train_images.shape[0],-1)#(60000,784)train_images=train_images.astype('float32')/255
test_images=test_images.reshape(test_images.shape[0],-1)test_images=test_images.astype('float32')/255
#将标签变为one-hot形状(60000,10)float32train_labels=utils.to_categorical(train_labels)#测试数据标签不用变为one-hot(10000,)test_labels=test_labels.astype(32)
#定义神经网络模型结构ann=create_ANN()
#开始训练
ann.train(train_images,cv2.ml.ROW_SAMPLE,train_labels)#在测试数据上测试准确率print(evaluate_acc(ann,test_images,test_labels))
8.1.2手写数字识别⑤模型保存及加载:#保存模型ann.save('mnist_ann.xml’)#加载模型myann=cv2.ml.ANN_MLP_load('mnist_ann.xml')预测准确率为:0.9376028.2Paddle文字识别理论+实操8.2Paddle文字识别①安装百度PaddlePaddlecondaactivateopencv4.7pipinstallpaddlepaddle-i/pypi/simpleWindows下需要安装shapely库,下载地址:/~gohlke/pythonlibs/#shapely注意python版本,本书下载的版本为shapely-1.8.2-cp39-cp39-win_amd64.whlpipinstallShapely-1.8.2-cp39-cp39-win_amd64.whl②安装PaddleOCR包,指令如下:pipinstall"paddleocr>=2.0.1"#推荐使用2.0.1+版本8.2Paddle文字识别③
下载PaddleOcr源码/paddlepaddle/PaddleOCR④拷贝源码doc文件夹内的imgs和fonts目录拷贝到自己项目data目录下8.2Paddle文字识别⑤测试OCR程序frompaddleocrimportPaddleOCR,draw_ocr
#Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换#例如`ch`,`en`,`fr`,`german`,`korean`,`japan`ocr=PaddleOCR(use_angle_cls=True,lang="ch")#needtorunonlyoncetodownloadandloadmodelintomemoryimg_path='./imgs/11.jpg'result=ocr.ocr(img_path,cls=True)foridxinrange(len(result)):res=result[idx]forlineinres:print(line)8.2Paddle文字识别⑥报错修正:RuntimeError:(NotFound)CannotopenfileC:\Users\宋桂岭/.paddleocr/whl\det\ch\ch_PP-OCRv3_det_infer/inference.pdmodel,pleaseconfirmwhetherthefileisnormal.切换到paddleocr.py,修改第55行代码:BASE_DIR=os.path.expanduser("D:\\DevTools\\paddle_ocr")#这个路径需要自己创建8.2Paddle文字识别⑦导入OpenCV包:importcv2fromPILimportImage,ImageDraw,ImageFontfont=cv2.FONT_HERSHEY_SIMPLEXimportnumpyasnp8.2Paddle文字识别⑧定义OpenCV显示中文函数:#opencv图像显示中文defputText_Chinese(img,strText,pos,color,fontSize):fontpath="data/fonts/simfang.ttf"font=ImageFont.truetype(fontpath,fontSize)img_pil=Image.fromarray(img)draw=ImageDraw.Draw(img_pil)draw.text(pos,strText,font=font,fill=color)img=np.array(img_pil)returnimg8.2Paddle文字识别⑨识别火车票img_path='data/sgl_ticket.jpg'img=cv2.imread(img_path)cv2.imshow("src",img)result=ocr.ocr(img_path,cls=True)print(result)8.2Paddle文字识别⑩可视化结果foridxinrange(len(result)):res=result[idx]forlineinres:print(line)print('----------------------------')print(line)pt1=((int)(line[0][0][0]),(int)(line[0][0][1]))pt2=((int)(line[0][1][0]),(int)(line[0][1][1]))pt3=((int)(line[0][2][0]),(int)(line[0][2][1]))pt4=((int)(line[0][3][0]),(int)(line[0][3][1]))cv2.line(img,pt1,pt2,(0,0,255),1,cv2.LINE_AA)cv2.line(img,pt2,pt3,(0,0,255),1,cv2.LINE_AA)cv2.line(img,pt3,pt4,(0,0,255),1,cv2.LINE_AA)cv2.line(img,pt1,pt4,(0,0,255),1,cv2.LINE_AA)img=putText_Chinese(img,line[1][0],(pt1[0],pt1[1]-10),(255,0,255),20)cv2.imshow("OCR-Result",img)cv2.imwrite("result.png",img)cv2.waitKey()cv2.destroyAllWindows()038.3车牌识别项目实战8.3车牌识别/detectRecog/CCPD数据集:CCPD数据集主要分为CCPD2019数据集和CCPD2020(CCPD-Green)数据集。CCPD2019数据集车牌类型仅有普通车牌(蓝色车牌),CCPD2020数据集车牌类型仅有新能源车牌(绿色车牌)。车辆识别流程:8.3车牌识别①识别图片名称为:CCPD2019\ccpd_base\025-89_92-331&290_585&392-592&383_347&391_348&293_593&285-0_0_15_33_10_32_27-87-60.jpg②彩色图像转灰度图像:importcv2frompaddleocrimportPaddleOCRfrommatplotlibimportpyplotaspltimg=cv2.imread("data/car/025-89_92-331&290_585&392-592&383_347&391_348&293_593&285-0_0_15_33_10_32_27-87-60.jpg")
#转灰度图gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
fig=plt.figure(figsize=(6,6))plt.imshow(gray,"gray"),plt.axis('off'),plt.title("gray")plt.show()8.3车牌识别③顶帽变换,保留图像高频区域信息:#创建一个17*17矩阵内核kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(17,17))#cv2.morphologyEx:形态学操作,将腐蚀膨胀结合使用#cv2.MORPH_TOPHAT:顶帽操作(原图像-开运算结果:突出灰度中亮的区域)tophat=cv2.morphologyEx(gray,cv2.MORPH_TOPHAT,kernel)
fig=plt.figure(figsize=(6,6))plt.imshow(tophat,"gray"),plt.axis('off'),plt.title("tophat")plt.show()8.3车牌识别④边缘提取:#Sobel算子提取y方向边缘y=cv2.Sobel(tophat,cv2.CV_16S,1,0)absY=cv2.convertScaleAbs(y)
fig=plt.figure(figsize=(6,6))plt.imshow(absY,"gray"),plt.axis('off'),plt.title("absY")plt.show()8.3车牌识别⑤二值化:ret,binary=cv2.threshold(absY,75,255,cv2.THRESH_BINARY)
fig=plt.figure(figsize=(6,6))plt.imshow(binary,"gray"),plt.axis('off'),plt.title("binary")plt.show()8.3车牌识别⑥利用开运算来实现纵向去噪kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(1,15))Open=cv2.morphologyEx(binary,cv2.MORPH_OPEN,kernel)
fig=plt.figure(figsize=(6,6))plt.imshow(Open,"gray"),plt.axis('off'),plt.title("Open")plt.show()8.3车牌识别⑦利用闭运算得到连通区域kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(41,15))close=cv2.morphologyEx(Open,cv2.MORPH_CLOSE,kernel)
fig=plt.figure(figsize=(6,6))plt.imshow(close,"gray"),plt.axis('off'),plt.title("close")plt.show()8.3车牌识别⑧可以反复利用kernel对图像进行膨胀,腐蚀操作,具体看教材代码,本步骤非必须:8.3车牌识别⑨通过轮廓查找得到车牌区域:img_copy=img.copy()
#得到轮廓contours,hierarchy=cv2.findContours(dilate,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#画出轮廓并显示cv2.drawContours(img_copy,contours,-1,(255,0,255),2)
fig=plt.figure(figsize=(6,6))img_copy=cv2.cvtColor(img_copy,cv2.COLOR_BGR2RGB)plt.imshow(img_copy,"gray"),plt.axis('off'),plt.title("Contours")plt.show()8.3车牌识别⑩非车牌区域剔除:count=0forcontourincontours:area=cv2.contourArea(contour)#计算轮廓内区域的面积#得到矩形区域:左顶点坐标、宽和高x,y,w,h=cv2.boundingRect(contour)#获取坐标值和宽度、高度
#获取轮廓区域的形状信息perimeter=cv2.arcLength(contour,True)#计算轮廓周长#以精度0.02近似拟合轮廓approx=cv2.approxPolyDP(contour,0.02*perimeter,True)#获取轮廓角点坐标CornerNum=len(approx)#轮廓角点的数量
#判断宽高比例、面积、轮廓角点数量,根据场景,判断条件可以增减,截取符合图片#if(w>h*3andw<h*7)andarea>1000andCornerNum<=5:ifh*3<w<h*7andarea>1000:print(count)print(f"CornerNum:{CornerNum},area:{area}")#截取车牌并显示print(x,y,w,h)img=img[(y-5):(y+h+5),(x-5):(x+w+5)]#高,宽
8.3车牌识别最终,利用PaddleOCR获得车牌号:ocr=PaddleOCR(use_angle_cls=False,use_gpu=False,lang="ch",show_log=False)#needtorunonlyoncetodownloadandloadmodelintomemoryifimgisNone:print("没有提取到车牌")exit()
ocr_text=ocr.ocr(img,cls=False)forlineinocr_text:number_plate=line[-1][-1][0]print("车牌:",end="")print(number_plate)
048.4镜头规格识别项目实战8.4镜头规格识别文字识别场景中有很多特殊情况,比如噪声、脏污、倾斜、变形等,都会对识别造成影响。环形文字也是其中一种,我们通常不能直接识别它们,而是先将文字转换到水平方向,再做识别待识别的镜头图像①彩色转灰度,利用均值滤波去噪:importcv2frompaddleocrimportPaddleOCRimportnumpyasnpimportmath
img=cv2.imread('data/lens.jpeg')img_copy=img.copy()
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)gray=cv2.medianBlur(gray,3)8.4镜头规格识别②查找圆形轮廓:8.4镜头规格识别#查找图中的圆形轮廓circles=cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,100,param1=200,param2=30,minRadius=260,maxRadius=300)
isNG=FalseifcirclesisNone:print("找圆失败!")参数说明如下:-image:8bit单通道灰度图像,输入图像-circles:检测到的圆的列表,三维向量(x,y,r)或者是(x,y,r,votes)-method:检测算法,现在只有HOUGH_GRADIENT-dp:double类型的dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器-minDist:圆心到检测到的圆的最小距离,如果太小多个相邻的圆会重合,太大某些圆不能被检测出来-param1:指定的参数,默认值为100,如果算法为HOUGH_GRADIENT,它表明传入给canny算子的最大阈值-param2:指定的参参,默认值为100,如果算法为HOUGH_GRADIENT,它表示检测阶段圆心的累加器阈值,越小可以检测到更多的圆,越大,通过检测的圆就越完美-minRadius:默认值0,表示圆半径的最小值。-maxRadius:默认值0,表示圆半径的最大值。③结果可视化:8.4镜头规格识别else:circles=np.uint16(np.around(circles))a,b,c=circles.shapeprint(circles.shape)foriinrange(b):cv2.circle(img_copy,(circles[0][i][0],circles[0][i][1]),circles[0][i][2],(0,0,255),3,cv2.LINE_AA)cv2.circle(img_copy,(circles[0][i][0],circles[0][i][1]),2,(0,255,0),3,cv2.LINE_AA)#drawcenterofcirclecv2.imshow("findCircle",img_copy)④极坐标变换,拉平图像:8.4镜头规格识别x=circles[0][i][0]-circles[0][i][2]y=circles[0][i][1]-circles[0][i][2]w=h=2*circles[0][i][2]center=(circles[0][i][0],circles[0][i][1])radius=circles[0][i][2]C=2*math.pi*radiusprint(C,radius)
ROI=img[y:y+h,x:x+w].copy()cv2.imshow('ROI',ROI)trans_center=(center[0]-x,center[1]-y)polarImg=cv2.warpPolar(ROI,(int(radius),int(C)),trans_center,radius,cv2.INTER_LINEAR+cv2.WARP_POLAR_LINEAR)polarImg=cv2.flip(polarImg,1)#镜像polarImg=cv2.transpose(polarImg)#转置cv2.imshow('polarImg',polarImg)⑤调用PaddleOCR识别:8.4镜头规格识别ocr=PaddleOCR(use_angle_cls=False,use_gpu=False,lang="ch",show_log=False)#needtorunonlyoncetodownloadandloadmodelintomemoryresult=ocr.ocr(polarImg,cls=False)foridxinrange(len(result)):res=result[idx]forlineinres:print('----------------------------')print(line)pt1=((int)(line[0][0][0]),(int)(line[0][0][1]))pt2=((int)(line[0][1][0]),(int)(line[0][1][1]))pt3=((int)(line[0][2][0]),(int)(line[0][2][1]))pt4=((int)(line[0][3][0]),(int)(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 支架材料与骨组织的界面结合强度评价
- 2026年初一道德与法治第二学期期末考试卷及答案(共八套)
- 2026年虚拟现实行业创新报告及元宇宙硬件设备发展报告
- 2026年固态电池储能技术报告及未来五至十年电池技术报告
- 基于情感计算的数字化学习压力评价与个性化辅导策略教学研究课题报告
- 2026年能源物联网智能监测报告
- 2026年数字货币跨境支付创新报告及监管框架研究报告
- 资源优化配置的知情同意优先级
- 2026年环保技术行业分析报告
- 高中气象模拟实验说课稿
- 江西省农发种业有限公司招聘考试真题2024
- 储备土地巡查管理办法
- JJG 688-2025汽车排放气体测试仪检定规程
- 【15万吨日供水量水厂设计中反应沉淀池设计计算过程案例2300字】
- 《铁路线路养护与维修》课件 2.1.5垫板修正作业
- T/CNCA 014-2022改性镁渣基胶凝材料
- 2025年安徽铜陵港航投资建设有限责任公司招聘笔试参考题库附带答案详解
- TCTBA 001-2019 非招标方式采购代理服务规范
- 1完整版本.5kw机器人专用谐波减速器设计
- CYC指标(指南针成本均线)使用详解
- 《国家电网公司电力安全工作规程(火电厂动力部分、水电厂动力部分)》
评论
0/150
提交评论