核心内容摘要
大雷插大狙:点燃梦想的火花,驰骋未来的荣耀
简介计算机视觉系列第一课opencv语法(
保姆级教学计算机视觉系列第一课opencv语法(
保姆级教学计算机视觉系列第一课opencv语法(
保姆级教学[计算机视觉第一课opencv(
保姆级教学][opencv 3]关于计算机视觉的基础内容我们之前已经说完了,今天我们就来用一个小案例来回顾并丰富一下我们的知识。
整体流程预处理模板图像,提取数字模板预处理信用卡图像,定位数字区域对每个数字区域进行处理,提取单个数字使用模板匹配识别每个数字输出识别结果card.pngtemplate.png这是数字模板,就是把银行卡号与这里面每一个数字对比实现模糊匹配
代码分析
导入工具包和参数设置# 导入工具包importnumpyasnp# 用于数值计算和数组操作importargparse# 用于解析命令行参数importcv2# OpenCV库,用于图像处理importmyutils# 自定义工具函数,包含图像 resize、轮廓排序等功能argparse用于解析命令行参数,允许用户通过命令行指定输入图像和模板图像:# 设置命令行参数# 创建 ArgumentParser 对象,用于定义和解析命令行参数ap=argparse.ArgumentParser()# 添加输入图像参数ap.add_argument("-i","--image",required=True,help="path to input image")# 输入信用卡图片的路径# 添加模板图像参数ap.add_argument("-t","--template",required=True,help="path to template OCR-A image")# 数字模板图片的路径# 解析参数并转换为字典形式args=vars(ap.parse_args())定义信用卡类型映射表,根据卡号第一位判断:FIRST_NUMBER={"3":"American Express","4":"Visa","5":"MasterCard","6":"Discover Card"}辅助函数cv_show用于显示图像:defcv_show(name,img):cv
imshow(name,img)cv
waitKey(
# 等待按键,0表示无限等待myutils.pyimportcv2defsort_contours(cnts,method='left-to-right'):reverse=Falsei=0ifmethod=='right-to-left'ormethod=='bottom-to-top':reverse=Trueifmethod=='top-to-bottom'ormethod=='bottom-to-top':i=1boundingBoxes=[cv
boundingRect(c)forcincnts](cnts,boundingBoxes)=zip(*sorted(zip(cnts,boundingBoxes),key=lambdab:b[1][i],reverse=reverse))# zip(*...) 使用星号操作符解包排序后的元组列表,并将其重新组合成两个列表:一个包含所有轮廓,另一个包含所有边界框。
returncnts,boundingBoxesdefresize(image,width=None,height=None,inter=cv
INTER_AREA):dim=None(h,w)=image.shape[:2]ifwidthisNoneandheightisNone:returnimageifwidthisNone:r=height/float(h)dim=(int(w*r),height)else:r=width/float(w)dim=(width,int(h*r))resized=cv
resize(image,dim,interpolation=inter)#默认是cv
INTER_AREA,即面积插值,适用于缩放图像returnresized这里定义了两个函数方法:sort_contours函数:轮廓排序这个函数的作用是按照指定的方式对图像中的轮廓进行排序,方便后续的图像处理和分析。
参数说明:cnts:需要排序的轮廓列表(通常来自cv
findContours的返回值)method:排序方法,可选值包括:‘left-to-right’(默认):从左到右排序‘right-to-left’:从右到左排序‘top-to-bottom’:从上到下排序‘bottom-to-top’:从下到上排序工作原理:首先根据排序方法设置reverse(是否反转排序结果)和i(排序依据的坐标索引):对于水平方向排序(左右),使用 x 坐标(索引
对于垂直方向排序(上下),使用 y 坐标(索引
反向排序(如 right-to-left)时设置reverse=TrueboundingBoxes = [cv
boundingRect(c) for c in cnts]:为每个轮廓计算边界框(外接矩形)cv
boundingRect(c)返回一个元组(x, y, w, h),其中 (x,y) 是矩形左上角坐标,w 和 h 是宽和高排序部分:zip(cnts, boundingBoxes)将轮廓与其对应的边界框组合成元组sorted(..., key=lambda b: b[1][i], reverse=reverse)根据边界框的指定坐标(x 或 y)进行排序zip(*...)解包排序后的结果,重新组合成轮廓列表和边界框列表返回排序后的轮廓和对应的边界框resize函数:图像缩放这个函数用于按比例调整图像的尺寸,可以指定宽度或高度,保持原图的宽高比。
参数说明:image:输入图像width:目标宽度(可选)height:目标高度(可选)inter:插值方法,默认为cv