使用 Opencv 比较签名



我想比较两个签名之间的相似之处。

Python version : 3.7.7
OpenCv version : 4.2.0

这是我到目前为止所做的:

from cv2 import *
import numpy as np

#uploading images
template = cv2.imread("C://Users//subhr//Ams_1.jpg")
original = cv2.imread("C://Users//subhr//Ams_2.jpg")
#resizing images
template = cv2.resize(template,(528,152))
cv2.imshow("template image", template)
cv2.waitKey(0)
cv2.destroyAllWindows()
template.shape #row.columns
original = cv2.resize(original,(528,152))
cv2.imshow("original image", original)
cv2.waitKey(0)
cv2.destroyAllWindows()
#ORB Detector
orb = cv2.ORB_create()
original = cv2.Canny(original, 50, 200)
template = cv2.Canny(template, 50, 200)
# key points and descriptor calculation
kp1, desc_1 = orb.detectAndCompute(template, None)
kp2, desc_2 = orb.detectAndCompute(original, None)
#creating matches
matcher = cv2.DescriptorMatcher_create(cv2.DescriptorMatcher_BRUTEFORCE_HAMMING)
matches_1 = matcher.knnMatch(desc_1, desc_2, 2)
len(matches_1)
result = cv2.drawMatchesKnn(original, kp1 , template, kp2, matches_1, None)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
#distance similarity
good_points = []
for m,n in matches_1:
if m.distance < 0.8* n.distance:
good_points.append(m)
len(good_points)
result = cv2.drawMatches(original, kp1 , template, kp2, good_points, None)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(len(kp1))
print(len(kp2))
#calculating ratio
print("How good is the match : ",len(kp1)/len(good_points))

在这一点上,我已经尝试了orbakaze,我想使用SIFT但它不可用。我尝试过Opencv 3.4版本,但没有运气。

有没有更好的方法来比较签名的相似性并标准化整个过程?

图片链接 : https://ibb.co/yhvTrng , https://ibb.co/xfBzCgW

谢谢。

您没有给出任何示例图像,但即便如此,我不确定使用球体或 Kaze/Akaze 等特征点是否是一个好主意。在以一定程度的准确性比较签名时,那些或多或少仍然能检测到类似角落的点似乎需要更多的知识(曲率等(。这看起来像是一个简单的卷积网络所擅长的。在我的头顶上,我认为你可以使用这样的架构:

signature --> Convnet --> head-1 --> signature embedding  ------>---
|                                             |---> (Hinge) loss
|                                             |
--> head-2 --> signtature embedding ---->----

其中损失迫使相似签名的嵌入接近,不同签名的嵌入彼此远离。

你可以把你的架构建立在这张有点旧的纸上。关于训练网络的数据,有很多数据集(看看这个kaggle链接 例如(。

编辑:由于您在评论中说您更喜欢避免基于深度学习的方法,我认为了解您当前的方法在功能方面缺乏什么会很有用。

您提取的低级特征(尽管不要提取 ORB,它被设计为快速、不准确,如果可以的话,坚持使用 KAZE 或 AKAZE(捕获本地信息,但对于签名识别来说重要的是它们在空间上的分布方式(在类似的签名中,分布应该大致相同(。这可以通过其中之一或两件事来解决:1(改变评估相似性的方式以纳入空间分布,而不仅仅是依赖共同特征点的数量2(手动设计一个高级互补特征,以捕获签名的全局方面(可以像高/宽比一样简单,也可以更复杂并考虑曲率等(。

最新更新