函数的设置
为了使图像识别的流程更加直观,我们提前设置一个函数用于图像识别过程中每一步的图像展示。
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用这个函数可以使得在图像识别过程中的每一步更加直观的展示出来,也可以用于检测每一步是否正确运行。
读取一个模板图像
我们进行图像识别的原理是将0-9十个数字的模板进行提取,然后一 一对银行卡进行一个模板匹配,以此来识别出我们需要的银行卡号。
因此,我们的第一步就是对数字模板进行读取。
img = cv2.imread("模板的路径")
cv_show('img',img)
接下来就是对这个模板进行一个轮廓检测,以此得到这个模板的图像信息。
- 转换成灰度图
ref = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv_show('ref',ref)
以上是转成灰度图的结果。
- 转换成二值图像
ref = cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)[1]
cv_show('ref',ref)
这里涉及到了一个二值图像转换的函数cv2.threshold()
首先介绍简单阈值函数:cv2.threshold(src, thresh, maxval, type[, dst]),返回值为retval, dst
其中:
src是灰度图像
thresh是起始阈值
maxval是最大值
type是定义如何处理数据与阈值的关系。有以下几种:
选项
像素值>thresh
其他情况
cv2.THRESH_BINARY
maxval
0
cv2.THRESH_BINARY_INV
0
maxval
cv2.THRESH_TRUNC
thresh
当前灰度值
cv2.THRESH_TOZERO
当前灰度值
0
cv2.THRESH_TOZERO_INV
0
当前灰度值
注意:在上面的例子中,我们在尾部加了个[1],意思是我们只取第二个返回值dst,而一般来说,我们也只会使用该函数的第二个返回值dst
- 计算轮廓
refCnts = cv2.findContours(ref.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[1]
cv2.drawContours(img,refCnts,-1,(0,0,255),3)
cv_show('img',img)
这里用到了两个计算轮廓的函数。
cv2.findContours():
cv2.findContours(image, mode, method, contours=None, hierarchy=None, offset=None)
contour返回值
cv2.findContours()函数首先返回一个list,list中每个元素都是图像中的一个轮廓信息,list中每个元素(轮廓信息)类型为ndarray。len(contours[1]) 表示第一个轮廓储存的元素个数,即该轮廓中储存的点的个数。
hierarchy返回值
该函数还可返回一个可选的hiararchy结果,这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为-1。
第一个数:表示同一级轮廓的下个轮廓的编号,如果这一级轮廓没有下一个轮廓,一般是这一级轮廓的最后一个的时候,则为-1。
第二个数:表示同一级轮廓的上个轮廓的编号,如果这一级轮廓没有上一个轮廓,一般是这一级轮廓的第一个的时候,则为-1。
第三个数:表示该轮廓包含的下一级轮廓的第一个的编号,假如没有,则为-1。
第四个数: 表示该轮廓的上一级轮廓的编号,假如没有上一级,则为-1。
cv2.drawContours():
cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
版权归原作者 zz1z 所有, 如有侵权,请联系我们删除。