Day 02 · 环境搭建:Python 数据分析零成本工具包
2026/7/26 23:56:32
计算机视觉系列第一课opencv语法(一)保姆级教学
计算机视觉系列第一课opencv语法(二)保姆级教学
计算机视觉系列第一课opencv语法(三)保姆级教学
[计算机视觉第一课opencv(四)保姆级教学][opencv 3]
关于计算机视觉的基础内容我们之前已经说完了,今天我们就来用一个小案例来回顾并丰富一下我们的知识。
card.png
template.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):cv2.imshow(name,img)cv2.waitKey(0)# 等待按键,0表示无限等待myutils.py
importcv2defsort_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=[cv2.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=cv2.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=cv2.resize(image,dim,interpolation=inter)#默认是cv2.INTER_AREA,即面积插值,适用于缩放图像returnresized这里定义了两个函数方法:
sort_contours函数:轮廓排序这个函数的作用是按照指定的方式对图像中的轮廓进行排序,方便后续的图像处理和分析。
参数说明:
cnts:需要排序的轮廓列表(通常来自cv2.findContours的返回值)
method:排序方法,可选值包括:
工作原理:
首先根据排序方法设置reverse(是否反转排序结果)和i(排序依据的坐标索引):
reverse=TrueboundingBoxes = [cv2.boundingRect(c) for c in cnts]:
cv2.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:插值方法,默认为cv2.INTER_AREA(面积插值)工作原理:
首先获取原图的高度和宽度:(h, w) = image.shape[:2]
处理特殊情况:
r = height / float(h),再计算对应的宽度r = width / float(w),再计算对应的高度执行缩放:
cv2.resize(image, dim, interpolation=inter)使用计算出的目标尺寸dim进行缩放cv2.INTER_AREA插值方法,这种方法在缩小图像时效果较好,能保持图像质量返回缩放后的图像
使用场景
sort_contours常用于需要按顺序处理轮廓的场景,如识别数字、字符时按阅读顺序排列resize是预处理的常用步骤,用于统一图像尺寸,方便后续处理或显示这部分的目的是从模板图像中提取 0-9 的数字特征,建立模板库:
# 读取模板图像img=cv2.imread(args["template"])cv_show('img',img)# 转换为灰度图ref=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv_show('ref',ref)# 转换为二值图像(黑底白字)ref