opencv有多强?看它如何识别你的银行卡并提取出卡号!.docx

上传人:安*** 文档编号:73266042 上传时间:2023-02-17 格式:DOCX 页数:15 大小:21.94KB
返回 下载 相关 举报
opencv有多强?看它如何识别你的银行卡并提取出卡号!.docx_第1页
第1页 / 共15页
opencv有多强?看它如何识别你的银行卡并提取出卡号!.docx_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《opencv有多强?看它如何识别你的银行卡并提取出卡号!.docx》由会员分享,可在线阅读,更多相关《opencv有多强?看它如何识别你的银行卡并提取出卡号!.docx(15页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、opencv有多强?看它如何识别你的银行卡并提取出卡号!前言一个好的深度学习算法工程师从来就是以及opencv、pilow、Matplotlib一起混合用由于这个代码不是我写的我就不上传代码了。opencv的安装这里我们使用python版opnecvc版本的根底算法也差不多。pipinstallopencv-python-is:/预备知识1.二值化ret,dstcv2.threshold(src,thresh,maxval,type)src输入图只能输入单通道图像通常来讲为灰度图thresh一般取127以及255maxval当像素值超过了阈值或小于阈值根据type来决定所赋予的值type二值化

2、操作的类型包含以下5种类型1.cv2.THRESH_BINARY超过阈值局部取maxval最大值否那么取02.cv2.THRESH_BINARY_INVTHRESH_BINARY的反转3.cv2.THRESH_TRUNC大于阈值局部设为阈值否那么不变4.cv2.THRESH_TOZERO大于阈值局部不改变否那么设为05.cv2.THRESH_TOZERO_INVTHRESH_TOZERO的反转常用THRESH_BINARY_INV自动找到阙值cv2.threshold(group,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)importcv2importma

3、tplotlib.pyplotaspltimgcv2.imread(cat.jpg)img_graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)ret,img_bicv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)ret,img_bi_invcv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)ret,img_trcv2.threshold(img_gray,127,255,cv2.THRESH_TRUNC)ret,img_zerocv2.threshold(img_

4、gray,127,255,cv2.THRESH_TOZERO)ret,img_zero_invcv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO_INV)titlesOriginal,Binary,Binary_INV,TRUNC,ZERO,ZERO_INVimagesimg,img_bi,img_bi_inv,img_tr,img_zero,img_zero_invforiinrange(6):plt.subplot(2,3,i1),plt.imshow(imagesi,gray),plt.title(titlesi)plt.xticks(),p

5、lt.yticks()#不显示坐标轴plt.show(2.轮廓检测contourshierarchycv2.findContours(image,mode,method,offset)image:8位单通道图像。视为二值图像contours:轮廓点。列表格式每一个元素为一个3维数组其形状为n,1,2其中n表示轮廓点个数2表示像素点坐标,表示一个轮廓hierarchy:轮廓间的层次关系,为三维数组形状为1,n,4其中n表示轮廓总个数4指的是用4个数表示各轮廓间的互相关系。第一个数表示同级轮廓的下一个轮廓编号第二个数表示同级轮廓的上一个轮廓的编号第三个数表示该轮廓下一级轮廓的编号第四个数表示该轮廓

6、的上一级轮廓的编号mode:轮廓检索的方式1.cv2.RETR_EXTERNAL:只检索外部轮廓2.cv2.RETR_LIST:检测所有轮廓且不建立层次构造3.cv2.RETR_CCOMP:检测所有轮廓建立两级层次构造4.cv2.RETR_TREE:检测所有轮廓建立完好的层次构造method:轮廓近似的方法1.cv2.CHAIN_APPROX_NONE:存储所有的轮廓点2.cv2.CHAIN_APPROX_SIMPLE:压缩程度垂直以及对角线段只留下端点。常用cv2.findContours(group.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIM

7、PLE)3.形态学腐蚀与膨胀属于形态学操作所谓的形态学就是改变物体的形状形象理解一些腐蚀变瘦(白色局部)膨胀变胖(白色局部)主要是采用cv2.erode()以及cv2.dilate()主要针对二值化图像的白色局部腐蚀是一种消除边界点使边界向内部收缩的经过.到亮区(背景)变细而黑色区域(字母)那么变大了。通俗讲法在原图的每一个小区域里取最小值由于是二值化图像只要有一个点为0那么都为0来到达瘦身的目的算法用3x3的kernel扫描图像的每一个像素用kernel与其覆盖的二值图像做“与操作假设都为1那么图像的该像素为1否那么为0.最终结果使二值图像减小一圈.膨胀是将与物体接触的所有背景点合并到该物体

8、中使边界向外部扩张的经过可以用来填补物体中的空洞。背景(白色)膨胀而黑色字母缩小了。算法用3x3的kernel扫描图像的每一个像素用kernel与其覆盖的二值图像做“与操作假设都为0那么图像的该像素为0否那么为1.最终结果使二值图像扩大一圈1.先腐蚀后膨胀的经过称为开运算。用来消除小物体、在纤细点处别离物体、平滑较大物体的边界的同时并不明显改变其面积【cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)】2.先膨胀后腐蚀的经过称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积.【cv2.morphologyEx(img,cv2

9、.MORPH_CLOSE,kernel)】3.膨胀减去腐蚀的经过称为梯度运算。用来计算轮廓【cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)】4.顶帽原始输入减去开运算结果【cv2.morphologyEx(img,cv.MORPH_TOPHAT,kernel)】5.黑帽闭运算减去原始输入【cv2.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)】3.sobel算子cv2.Sobel(src,ddepth,dx,dy,ksize)进展sobel算子计算src表示当前图片ddepth表示图片深度这里使用cv2.CV

10、_64F使得结果可以是负值dx表示x轴方向dy表示y轴方向,ksize表示挪动方框的大小cv2.convertScalerAbs(src)将像素点进展绝对值计算src表示当前图片importcv2importmatplotlib.pyplotaspltimgcv2.imread(pie.png,cv2.IMREAD_GRAYSCALE)sobelxcv2.Sobel(img,cv2.CV_64F,1,0,ksize3)#1,0:表示只算程度的不算竖直的sobelxxcv2.convertScaleAbs(sobelx)#sobelycv2.Sobel(img,cv2.CV_64F,0,1,ks

11、ize3)sobelyycv2.convertScaleAbs(sobely)#分别计算x以及y,再求以及,交融的较好sobelxy_1cv2.addWeighted(sobelxx,0.5,sobelyy,0.5,0)#不建议直接计算,交融的不好sobelxy_2cv2.Sobel(img,cv2.CV_64F,1,1,ksize3)#cv_show(pie,img)cv2.imshow(sobelx,sobelx)cv2.imshow(sobelxx,sobelxx)cv2.imshow(sobely,sobely)cv2.imshow(sobelyy,sobelyy)cv2.imshow

12、(sobelxy_1,sobelxy_1)cv2.imshow(sobelxy_2,sobelxy_2)cv2.waitKey(0)cv2.destroyAllWindows()4.模版匹配模板匹配以及卷积原理很像,模板在原图像上从原点开场滑动,计算模板与(图像被模板覆盖的地方)的差异程度,这个差异程度的计算方法在opencv里有6种,然后格每次计算的結果放入一个矩阵里,作为結果输出.假设原图形是AxB大小,而模板是axb大小,那么输出结果的矩阵是(A-a1)x(B-b1)简单来讲模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。cv2.matchTemplate(image,temp

13、l,method,resultNone,maskNone)image待搜索图像templ模板图像method计算匹配程度的方法返回参数res是一个结果矩阵假设待匹配图像为I宽高为(W,H)模板图像为T宽高为(w,h)。那么result的大小就为(W-w1,H-h1)其中methodTM-SQDIFF:计算平方不同,计算出来的值越小,越相关TM_CCORR:计算相关性,计算出来的值越大,越相关TM_CCOEFF:计算相关系数,计算出来的值越大,越相关TMSQDIFF-NORMED:计算归一化平方不同,计算出来的值越接近0,越相关TM_CCORR-NORMED:计t算归一化相关性,计算出来的值越接

14、近1,越相关TM-CCOEFF-NORMED:计算归一化相关系数,计算出来的值越接近1,越相关工程步骤1.准备识别模版准备好识别模版对它进展opencv操作拆分为单个图0,1,2,3,4,5并按从左到右排序。2.对银行卡操作对银行卡局部进展opencv的一些列操作选取银行卡卡号的局部进展拆分并排序。3.模版匹配利用模版匹配计算得分最高的银行卡号进展识别。详细代码文件配置apargparse.ArgumentParser()ap.add_argument(-i,-image,default./image/credit_card_01.png,requiredTrue,helppathtoinpu

15、timage)ap.add_argument(-t,-template,default./image/ocr_a_reference.png,requiredTrue,helppathtotemplateOCR-Aimage)argsvars(ap.parse_args()#指定信誉卡类型FIRST_NUMBER3:AmericanExpress,4:Visa,5:MasterCard,6:DiscoverCard#绘图展示defcv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()print(ar

16、gstemplate)识别模版读取与裁剪imgcv2.imread(argstemplate)cv_show(tem,img)#灰度图refcv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv_show(GRAY,ref)#二值化refcv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)1cv_show(GRAY1,ref)refCnts,hierarchycv2.findContours(ref.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#cv版本大于3.8的,只有两个返

17、回值cv2.drawContours(img,refCnts,-1,(0,0,255),3)cv_show(GRAY1,img)refCntsmyutils.sort_contours(refCnts,methodleft-to-right)0digits#存模板的单个数字#2.遍历每一个轮廓,外接矩形for(i,c)inenumerate(refCnts):#计算外接矩形并且resize成适宜大小(x,y,w,h)cv2.boundingRect(c)#3.抠出模板roirefy:yh,x:xw#每个roi对应一个数字roicv2.resize(roi,(57,88)#太小,调大点cv_sh

18、ow(waijie,roi)#4.每一个数字对应每一个模板digitsiroi代码拆分imgcv2.imread(argstemplate)cv_show(tem,img)#灰度图refcv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv_show(GRAY,ref)#二值化refcv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)1cv_show(GRAY1,ref)123refCnts,hierarchycv2.findContours(ref.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPRO

19、X_SIMPLE)#cv版本大于3.8的,只有两个返回值cv2.drawContours(img,refCnts,-1,(0,0,255),3)cv_show(GRAY1,img)12345for(i,c)inenumerate(refCnts):#计算外接矩形并且resize成适宜大小(x,y,w,h)cv2.boundingRect(c)#3.抠出模板roirefy:yh,x:xw#每个roi对应一个数字roicv2.resize(roi,(57,88)#太小,调大点cv_show(waijie,roi)#4.每一个数字对应每一个模板digitsiroi123456789#初始化卷积核的大

20、小#kernelcv2.getStructuringElement(shape,ksize,anchor)#shape:核的形状#cv2.MORPH_RECT:矩形#cv2.MORPH_CROSS:十字形(以矩形的锚点为中心的十字架)#cv2.MORPH_ELLIPSE:椭圆(矩形的内切椭圆#ksize:核的大小矩形的宽高格式为(width,height)#anchor:核的锚点默认值为(-1,-1),即核的中心点#卷积核的大小根据工程设定rectKernelcv2.getStructuringElement(cv2.MORPH_RECT,(9,3)sqKernelcv2.getStructu

21、ringElement(cv2.MORPH_RECT,(5,5)银行卡读取与裁剪#2.读取输入图像预处理imagecv2.imread(argsimage)cv_show(Input_img,image)imagemyutils.resize(image,width300)graycv2.cvtColor(image,cv2.COLOR_BGR2GRAY)cv_show(Input_gray,gray)#3.礼帽操作突出更亮堂的区域#形态学操作,礼帽闭操作可以突出亮堂区域,但并不是非得礼帽闭操作tophatcv2.morphologyEx(gray,cv2.MORPH_TOPHAT,rectK

22、ernel)cv_show(tophat,tophat)#4.x方向的Sobel算子,实验说明,加y的效果的并不好gradXcv2.Sobel(tophat,ddepthcv2.CV_32F,dx1,dy0,ksize-1)#ksize-1相当于用3*3的#sobelyycv2.convertScaleAbs(gradX)#cv_show(gradXt,sobelyy)#x方向取绝对值-归一化#绝对值归一化#归一化x(x-min)/(max-mingradXnp.absolute(gradX)#absolute:计算绝对值(minVal,maxVal)(np.min(gradX),np.max

23、(gradX)gradX(255*(gradX-minVal)/(maxVal-minVal)gradXgradX.astype(uint8)print(np.array(gradX).shape)cv_show(Input_Sobel_gradX,gradX)#通过闭操作先膨胀再腐蚀将数字连在一起.变亮gradXcv2.morphologyEx(gradX,cv2.MORPH_CLOSE,rectKernel)cv_show(Input_CLOSE_gradX,gradX)#THRESH_OTSU会自动寻找适宜的阈值合适双峰需把阈值参数设置为0threshcv2.threshold(grad

24、X,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)1cv_show(Input_thresh,thresh)#再来一个闭操作填补空洞#两段代码雷同#onekernelnp.ones(9,9),np.uint8)#threshcv2.morphologyEx(thresh,cv2.MORPH_CLOSE,onekernel)threshcv2.morphologyEx(thresh,cv2.MORPH_CLOSE,sqKernel)#填补空洞cv_show(Input_thresh_CLOSE,thresh)#计算轮廓threshCnts,hierarchycv

25、2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#1.遍历轮廓locs#存符合条件的轮廓fori,cinenumerate(threshCnts):#计算矩形x,y,w,hcv2.boundingRect(c)arw/float(h)#选择适宜的区域根据实际任务来这里的根本都是四个数字一组ifar2.5andar4.0:if(w40andw55)and(h10andh20):#符合的留下来locs.append(x,y,w,h)#将符合的轮廓从左到右排序#x:x字母可以随意修改排序方式按照中括号里面的

26、维度0按照第一维1按照第二维。locssorted(locs,keylambdax:x0)分解代码graycv2.cvtColor(image,cv2.COLOR_BGR2GRAY)cv_show(Input_gray,gray)#3.礼帽操作突出更亮堂的区域#形态学操作,礼帽闭操作可以突出亮堂区域,但并不是非得礼帽闭操作tophatcv2.morphologyEx(gray,cv2.MORPH_TOPHAT,rectKernel)cv_show(tophat,tophat)#4.x方向的Sobel算子,实验说明,加y的效果的并不好gradXcv2.Sobel(tophat,ddepthcv2

27、.CV_32F,dx1,dy0,ksize-1)#ksize-1相当于用3*3的#x方向取绝对值-归一化#绝对值归一化#归一化x(x-min)/(max-mingradXnp.absolute(gradX)#absolute:计算绝对值(minVal,maxVal)(np.min(gradX),np.max(gradX)gradX(255*(gradX-minVal)/(maxVal-minVal)gradXgradX.astype(uint8)#通过闭操作先膨胀再腐蚀将数字连在一起.变亮gradXcv2.morphologyEx(gradX,cv2.MORPH_CLOSE,rectKerne

28、l)cv_show(Input_CLOSE_gradX,gradX)#THRESH_OTSU会自动寻找适宜的阈值合适双峰需把阈值参数设置为0threshcv2.threshold(gradX,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)1cv_show(Input_thresh,thresh)进展模版匹配遍历每一个轮廓中的数字output#存正确的数字for(i,(gx,gy,gw,gh)inenumerate(locs):groupOutput#根据坐标提取每一个组(4个值)groupgraygy-5:gygh5,gx-5:gxgw5#往外扩一点#cv_s

29、how(group_str(i),group)#二值化预处理groupcv2.threshold(group,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)1#二值化的group#cv_show(group2_str(i),group)#把每个轮廓分成小轮廓digitCntscv2.findContours(group.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)0#排序digitCntsmyutils.sort_contours(digitCnts,methodleft-to-right)0forcind

30、igitCnts:z0(x,y,w,h)cv2.boundingRect(c)#外接矩形roigroupy:yh,x:xw#在原图中取出小轮廓覆盖区域,即数字roicv2.resize(roi,(57,88)#cv_show(roi,roi)scores#进展遍历模版匹配for(digit,digitROI)indigits.items():#进展模板匹配,res是结果矩阵rescv2.matchTemplate(roi,digitROI,cv2.TM_CCOEFF)#此时roi是XdigitROI是0依次是1,2.匹配10次,看模板最高得分多少Max_scorecv2.minMaxLoc(r

31、es)1#返回4个,取第二个最大值Maxscorescores.append(Max_score)#10个最大值print(scores,scores)groupOutput.append(str(np.argmax(scores)zz1#2画出来cv2.rectangle(image,(gx-5,gy-5),(gxgw5,gygh5),(0,0,255),1)#左上角,右下角#putText参数图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细cv2.putText(image,.join(groupOutput),(gx,gy-15),cv2.FONT_HERSHEY_SIMPL

32、EX,0.65,(0,0,255),2)#得到结果output.extend(groupOutput)print(groupOutput:,groupOutput)cv_show(result,image)进展模版匹配遍历每一个轮廓中的数字output#存正确的数字for(i,(gx,gy,gw,gh)inenumerate(locs):groupOutput#根据坐标提取每一个组(4个值)groupgraygy-5:gygh5,gx-5:gxgw5#往外扩一点#cv_show(group_str(i),group)#二值化预处理groupcv2.threshold(group,0,255,c

33、v2.THRESH_BINARY|cv2.THRESH_OTSU)1#二值化的group#cv_show(group2_str(i),group)#把每个轮廓分成小轮廓digitCntscv2.findContours(group.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)0#排序digitCntsmyutils.sort_contours(digitCnts,methodleft-to-right)0forcindigitCnts:z0(x,y,w,h)cv2.boundingRect(c)#外接矩形roigroupy:yh,x:xw#

34、在原图中取出小轮廓覆盖区域,即数字roicv2.resize(roi,(57,88)#cv_show(roi,roi)scores#进展遍历模版匹配for(digit,digitROI)indigits.items():#进展模板匹配,res是结果矩阵rescv2.matchTemplate(roi,digitROI,cv2.TM_CCOEFF)#此时roi是XdigitROI是0依次是1,2.匹配10次,看模板最高得分多少Max_scorecv2.minMaxLoc(res)1#返回4个,取第二个最大值Maxscorescores.append(Max_score)#10个最大值print(

35、scores,scores)groupOutput.append(str(np.argmax(scores)zz1#2画出来cv2.rectangle(image,(gx-5,gy-5),(gxgw5,gygh5),(0,0,255),1)#左上角,右下角#putText参数图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细cv2.putText(image,.join(groupOutput),(gx,gy-15),cv2.FONT_HERSHEY_SIMPLEX,0.65,(0,0,255),2)#得到结果output.extend(groupOutput)print(groupOutput:,groupOutput)cv_show(result,image)你学会了吗如需获取系列教程加群1136192749爬遍天下无敌手

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 工程图纸

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com