在对有模板的图片进行ocr之前,比如发票,可以使用sift找到图片的特征,与模板图片关键点进行匹配矫正,可以处理旋转90°180°270°图片。
1. 使用sift找到关键点
SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。sift专利2020年3月刚过期,现在可以免费使用了。
img = cv2.imread('data/00.jpg')
gray= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img,None)
img = cv2.drawKeypoints(img,keypoints_1,img)
图上彩色的小圆圈就是关键特征点。
模板图片特征点2. 两张图的关键点进行匹配
FlannBasedMatcher ( 快速最近邻逼近搜索函数库(Fast Approximate Nearest Neighbor Search Library) )速度快,也可以使用暴力的BFMatcher,速度较慢。
# FLANN 参数设计
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
matchesMask = [[0,0] for i in range(len(matches))]
# 挑选出匹配较好的一些点
good = []
for m,n in matches:
if m.distance < 0.75 * n.distance:
good.append([m])
img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
拍摄图片与模板图片匹配上的特征点
3. 使用关键点矫正
findHomography: 计算多个二维点对之间的最优单映射变换矩阵 H(3行x3列) ,使用最小均方误差或者RANSAC方法
kp_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good]).reshape(-1,1,2)
#使用两张图对应上的关键点,得到变换矩阵
H, status = cv2.findHomography(sensed_matched_kpts, kp_matched_kpts, cv2.RANSAC,5.0)
warped_image = cv2.warpPerspective(img2, H, (img1.shape[1], img1.shape[0]))
矫正之后的图片
之后再做ocr任务就会简单很多了。还能找出特定要抽的信息区域。
原始图片
参考:
https://blog.csdn.net/zhangziju/article/details/79754652
https://www.jiqizhixin.com/articles/2019-08-06-9
网友评论