Python opencv特征与空公式模板匹配
我一直在尝试将扫描的公式与其空模板进行匹配。目标是旋转和缩放它以匹配模板Python opencv特征与空公式模板匹配,python,opencv,computer-vision,pattern-matching,feature-detection,Python,Opencv,Computer Vision,Pattern Matching,Feature Detection,我一直在尝试将扫描的公式与其空模板进行匹配。目标是旋转和缩放它以匹配模板 源(左)、模板(右) 匹配(左),单应性扭曲(右) 模板不包含任何非常特定的徽标、固定十字或矩形框架,它们可以方便地帮助我进行特征或图案匹配。更糟糕的是,扫描的公式可能会被扭曲、修改,并包含手写签名和印章 在测试ORB特征匹配失败后,我的方法是专注于公式的形状(线和柱) 我在这里提供的图片是通过在具有一定最小尺寸的段检测(LSD)后重建线获得的。源和模板剩下的大部分内容是文档布局本身 在下面的脚本中(该脚本应与图片一
源(左)、模板(右)
匹配(左),单应性扭曲(右)
模板不包含任何非常特定的徽标、固定十字或矩形框架,它们可以方便地帮助我进行特征或图案匹配。更糟糕的是,扫描的公式可能会被扭曲、修改,并包含手写签名和印章 在测试ORB特征匹配失败后,我的方法是专注于公式的形状(线和柱) 我在这里提供的图片是通过在具有一定最小尺寸的段检测(LSD)后重建线获得的。源和模板剩下的大部分内容是文档布局本身 在下面的脚本中(该脚本应与图片一起开箱即用),我尝试进行ORB功能匹配,但未能成功,因为它只关注边缘,而不是文档布局
import cv2 # using opencv-python v3.4
import numpy as np
from imutils import resize
# alining image using ORB descriptors, then homography warp
def align_images(im1, im2,MAX_MATCHES=5000,GOOD_MATCH_PERCENT = 0.15):
# Detect ORB features and compute descriptors.
orb = cv2.ORB_create(MAX_MATCHES)
keypoints1, descriptors1 = orb.detectAndCompute(im1, None)
keypoints2, descriptors2 = orb.detectAndCompute(im2, None)
# Match features.
matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING)
matches = matcher.match(descriptors1, descriptors2, None)
# Sort matches by score
matches.sort(key=lambda x: x.distance, reverse=False)
# Remove not so good matches
numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT)
matches = matches[:numGoodMatches]
# Draw top matches
imMatches = cv2.drawMatches(im1, keypoints1, im2, keypoints2, matches, None)
# Extract location of good matches
points1 = np.zeros((len(matches), 2), dtype=np.float32)
points2 = np.zeros((len(matches), 2), dtype=np.float32)
for i, match in enumerate(matches):
points1[i, :] = keypoints1[match.queryIdx].pt
points2[i, :] = keypoints2[match.trainIdx].pt
# Find homography
h, mask = cv2.findHomography(points1, points2, cv2.RANSAC)
# Use homography
if len(im2.shape) == 2:
height, width = im2.shape
else:
height, width, channels = im2.shape
im1Reg = cv2.warpPerspective(im1, h, (width, height))
return im1Reg, h, imMatches
template_fn = './stack/template.jpg'
image_fn = './stack/image.jpg'
im = cv2.imread(image_fn, cv2.IMREAD_GRAYSCALE)
template = cv2.imread(template_fn, cv2.IMREAD_GRAYSCALE)
# aligh images
imReg, h, matches = align_images(template,im)
# display output
cv2.imshow('im',im)
cv2.imshow('template',template)
cv2.imshow('matches',matches)
cv2.imshow('result',imReg)
cv2.waitKey(0)
cv2.destroyAllWindows()
有没有办法让模式匹配算法在左边的图像上工作(来源)?(另一个想法是只留下线路交叉点)
或者,我一直在尝试对循环进行缩放和旋转不变的模式匹配,同时保持最大相关性,但这太耗费资源,不太可靠
因此,我正在使用opencv寻找正确方向的提示。解决方案 问题是如何将图像缩小到真正重要的位置:布局。
此外,ORB也不合适,因为它不像SIFT和AKAZE那样健壮(旋转和大小不变) 我的工作如下:
- 将图像转换为黑白
- 使用小于宽度1/60的线段检测和过滤线
- 从分段重建图像(线宽影响不大)
- (可选:调整图片大小以加快其他图片的速度)
- 对线重建应用高斯变换,宽度的1/25
- 使用SIFT(专利)或AKAZE(免费)算法检测和匹配特征
- 找到单应性并扭曲源图片以匹配模板
赤色火柴
筛选匹配 我注意到:
- 模板的布局必须匹配,否则它只会坚持它所识别的内容
- 线检测更好,分辨率更高,由于采用了高斯分布,因此可以缩小尺寸
- SIFT比AKAZE产生更多的特性,看起来更可靠